iOS简单动画
知识架构
- CALayer 图层类
- CABasicAnimation 基础动画
- CAKeyFrameAnimation 帧动画
- CATransition 转场动画
- CAAnimationGroup 动画组
- layer的基本概念
其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(CALyer对象),通过UIView的layer属性可以访问这个层。
- 基本属性
Bounds;position;frame;backgroundColor; opacity;cornerRadius;borderWidth; borderColor;shadowOffset; shadowColor; shadowOpacity;
我写了一些简单的demo,大家可以看看.......
//
// ViewController.m
// 简单的动画
//
// Created by 李盼盼 on 16/5/16.
// Copyright © 2016年 李盼盼. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@property (strong, nonatomic) CALayer *subLayer;
@property (strong, nonatomic) UIView *redView;
@property (strong, nonatomic) CALayer *subLayer2;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (assign, nonatomic) NSInteger currentIndex;
@end
@implementation ViewController
- (void)viewDidLoad {
self.view.backgroundColor = [UIColor colorWithRed:234/255.0f green:234/255.0f blue:234/255.0f alpha:1];
[super viewDidLoad];
// 行走的方块
_subLayer = [[CALayer alloc]init];
_subLayer.frame = CGRectMake(50, 50, 50, 50);
_subLayer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:_subLayer];
// 旋转放大的方块
_redView = [[UIView alloc]initWithFrame:CGRectMake(200, 100, 50, 50)];
_redView.backgroundColor = [UIColor yellowColor];
[self.view addSubview:_redView];
// 慢慢放大的方块
_subLayer2 = [[CALayer alloc]init];
_subLayer2.frame = CGRectMake(50, 250, 50, 50);
_subLayer2.backgroundColor = [UIColor grayColor].CGColor;
[self.view.layer addSublayer:_subLayer2];
// 仿真翻页
_imageView.image = [UIImage imageNamed:@"a0.jpg"];
_currentIndex = 0;
}
#pragma mark ---- 上一张
- (IBAction)Last:(UIButton *)sender {
if (_currentIndex == 0) {
_currentIndex = 12;
}else{
_currentIndex--;
}
_imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"a%ld.jpg",_currentIndex]];
// 转场动画
CATransition *anim = [CATransition animation];
// 过度类型
anim.type = @"pageUnCurl";
// 动画过渡方向
anim.subtype = @"fromTop";
anim.duration = 0.8;
[_imageView.layer addAnimation:anim forKey:nil];
}
#pragma mark ---- 下一张
- (IBAction)next:(UIButton *)sender {
if (_currentIndex == 12) {
_currentIndex = 0;
}else{
_currentIndex++;
}
_imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"a%ld.jpg",_currentIndex]];
CATransition *anim = [CATransition animation];
anim.type = @"pageCurl";
anim.subtype = kCATransitionFromBottom;
anim.duration = 0.8;
[_imageView.layer addAnimation:anim forKey:nil];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
#pragma mark ---- 旋转放大的动画
CABasicAnimation *rotationAnim = [CABasicAnimation animation];
// rotationAnim.duration = 2;
rotationAnim.keyPath = @"transform.rotation.z";
rotationAnim.toValue = @(3.14);
rotationAnim.repeatCount = MAXFLOAT;
CABasicAnimation *scaleAnim = [CABasicAnimation animation];
scaleAnim.duration = 2;
scaleAnim.keyPath = @"transform";
scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2, 2, 0)];
scaleAnim.repeatCount = MAXFLOAT;
CAAnimationGroup *group = [CAAnimationGroup animation];
group.animations = @[rotationAnim,scaleAnim];
group.duration = 5;
group.fillMode = kCAFillModeForwards;
group.removedOnCompletion = NO;
[_redView.layer addAnimation:group forKey:nil];
}
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
#pragma mark ---- 行走的方块
CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
anim.keyPath = @"position";
anim.duration = 5.0;
NSValue *value = [NSValue valueWithCGPoint:CGPointMake(50, 50)];
NSValue *value1 = [NSValue valueWithCGPoint:CGPointMake(50, 100)];
NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(100, 150)];
NSValue *value4 = [NSValue valueWithCGPoint:CGPointMake(100, 150)];
NSValue *value5 = [NSValue valueWithCGPoint:CGPointMake(50, 50)];
anim.values = @[value,value1,value2,value3,value4,value5];
// 设置动画的执行节奏
// kCAMediaTimingFunctionEaseInEaseOut:开始较慢,中间会加速,结束会减速
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
[self.subLayer addAnimation:anim forKey:nil];
#pragma mark ---- 慢慢放大的方块
CABasicAnimation *anim1 = [CABasicAnimation animation];
// 动画执行是我时候修改属性
anim1.keyPath = @"bounds";
// 起始值
// anim1.fromValue = [NSValue valueWithCGRect:CGRectMake(50, 250, 50, 50)];
// 目标值
anim1.toValue = [NSValue valueWithCGRect:CGRectMake(50, 250, 100, 100)];
anim1.delegate = self;
anim1.duration = 5;
[_subLayer2 addAnimation:anim1 forKey:@"animation"];
/**不删除动画,同时保存动画最终效果**/
// 动画结束后自动删除动画
anim.removedOnCompletion = NO;
// 默认保存原来的样式:设置为使用最新的样式
anim.fillMode = kCAFillModeForwards;
}
- (IBAction)removeAnim:(UIButton *)sender {
[_subLayer2 removeAnimationForKey:@"animation"];
}
#pragma mark ---- 动画的代理
-(void)animationDidStart:(CAAnimation *)anim{
NSLog(@"%s",__func__);
}
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
NSLog(@"%s",__func__);
}
@end
效果如下:

iOS简单动画的更多相关文章
- IOS 简单动画 首尾式动画
首尾式动画 首尾式动画即通过实现控件由初始状态到结束状态的过程.(主要表现在控件的Frame 透明度 ) // // ViewController.m // CX 简单动画 // // Created ...
- iOS 简单动画 序列帧动画
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSLog(@"旭宝爱吃 ...
- iOS 简单动画 block动画
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ UIView * view = [ ...
- iOS简单动画效果:闪烁、移动、旋转、路径、组合
#define kDegreesToRadian(x) (M_PI * (x) / 180.0) #define kRadianToDegrees(radian) (radian*180.0)/(M_ ...
- iOS CAReplicatorLayer 简单动画
代码地址如下:http://www.demodashi.com/demo/11601.html 写在最前面,最近在看学习的时候,偶然间发现一个没有用过的Layer,于是抽空研究了下,本来应该能提前记录 ...
- iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题
本文转载至 http://www.tuicool.com/articles/aANBF3m 时间 2014-12-07 20:13:37 segmentfault-博客原文 http://segm ...
- IOS 核心动画之CAKeyframeAnimation - iBaby
- IOS 核心动画之CAKeyframeAnimation - 简单介绍 是CApropertyAnimation的子类,跟CABasicAnimation的区别是:CABasicAnimation ...
- Swift 实现iOS Animation动画教程
这是一篇翻译文章.原文出处:http://www.raywenderlich.com/95910/uiview-animation-swift-tutorial 动画( animation)是iOS用 ...
- iOS 开发--动画
在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的.我们总是追求更为酷炫的实现,如果足够仔细 ...
随机推荐
- ajax pagination 布局刷新
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- 【Raspberry Pi】新入手的Raspberry Pi3拼装日志
一.概述 2016年暑假某宝入手Raspberry Pi 3,装机清单: 树莓派主板 亚克力外壳 小风扇 散热片 30G SD card 螺丝若干颗 因机型问题,可能与你的机器有微小差异 二.装机过程 ...
- Python获取当前日期及时间
import time def GetNowTime(): return time.strftime("%Y%m%d%H%M%S",time.localtime(time.time ...
- mysql刷日志的两个参数
innodb_flush_log_at_trx_commit 0:每秒 ----log---disk1:事物提交 ---log ---disk2:事物提交---log 每秒 ---disk sync_ ...
- eclipse护眼颜色和字体大小设置
♣eclipse护眼颜色和关键字颜色设置 ♣eclipse字体大小设置(包括jsp , .xml ,.java) 1.Eclipse字体大小调整: 窗口(Window)-首选项(Preferences ...
- poj3740
#include<stdio.h>#include<iostream>int map[16][300];int vistx[16];int visty[300];int zhe ...
- js、css引用文件的下载方式
js.css引用文件的下载方式 一.测试(chrome):1.直接使用<script...>.<link...>标签来混合引入脚本文件和css文件, <script as ...
- Enable Cross-Origin Requests in Asp.Net WebApi 2[Reprint]
Browser security prevents a web page from making AJAX requests to another domain. This restriction i ...
- linux 压缩 解压zip 命令
将当前目录下的所有文件和文件夹全部压缩成test.zip文件,-r表示递归压缩子目录下所有文件zip -r test.zip ./* 打包目录zip test2.zip test2/*解压test.z ...
- Push:iOS基于APNS的消息推送
1. Push的三个步骤,如下图所示: (1)Push服务应用程序把要发送的消息.目的iPhone的标识打包,发给APNS: (2)APNS在自身的已注册Push服务的iPhone列表中,查找有相应标 ...