#import "FirstVC.h"
@implementation FirstVC
/*
    创建xib过程
    1 创建xib(名字和类名相同)
    2 文件拥有者为类名
    3 和类的view连线
 */
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}
 
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
 
//UIView属性动画
- (IBAction)pressPropertyAnimation:(id)sender {
    //1 准备动画
    //参数1: 动画的作用, 用来区分多个动画, 参数二: 传递参数用 nil:OC中使用 NULL:C语言使用
    [UIView beginAnimations:@"改变大小" context:NULL];
    //在准备动画的时候可以设置动画的属性
    [UIView setAnimationDuration:2];//设置动画的持续时间
    [UIView setAnimationDelegate:self];
    [UIView setAnimationWillStartSelector:@selector(startAnimation)];
//    [UIView setAnimationDelay:1];//动画延迟执行时间
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];//动画的曲线
    [UIView setAnimationRepeatCount:20];//动画的重复次数
    [UIView setAnimationRepeatAutoreverses:YES];//动画往返执行, 必须设置动画的重复次数
    //2 修改view的属性, 可以同时修改多个属性 注意:不是所有的属性都可以修改的(只有frame, center, bounds, backgroundColor, alpha, transform 可以修改)
    self.changeView.frame = CGRectMake(110100100100);
//    self.changeView.backgroundColor = [UIColor brownColor];
    self.changeView.backgroundColor = [UIColor colorWithRed:arc4random() % 256 255.0 green:arc4random() % 256 255.0 blue:arc4random() % 256 255.0 alpha:0.5];
    //3 提交并执行动画
    [UIView commitAnimations];
}
//UIView过度动画
- (IBAction)pressTranstionAnimation:(id)sender {
    //1 准备动画
    [UIView beginAnimations:@"过度动画" context:NULL];
    [UIView setAnimationDuration:5];
    [UIView setAnimationRepeatCount:50];
    //2 设置过度样式
    //参数1: 过度样式, 参数2: 指定那个View做动画, 参数3: 是否设置缓存
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.changeView cache:YES];
    self.changeView.backgroundColor = [UIColor colorWithRed:arc4random() % 256 255.0 green:arc4random() % 256 255.0 blue:arc4random() % 256 255.0 alpha:0.5];
    //3 提交并执行动画
    [UIView commitAnimations];
}
 
//Block动画
- (IBAction)pressBlockAnimation:(id)sender {
    //只有一行代码 Block动画实质是对UIView动画的封装
    //参数1:动画时长 参数2:Block: 设置要修改的View属性
    /*
    [UIView animateWithDuration:2 animations:^{
        self.changeView.backgroundColor = [UIColor orangeColor];
    }];
     */
    //第二种Block
    /*
    //参数1:动画时长 参数2:Block: 设置要修改的View属性 参数3: 动画完成时调用
    [UIView animateWithDuration:2 animations:^{
        self.changeView.backgroundColor = [UIColor orangeColor];
    } completion:^(BOOL finished) {
        //finished判断动画是否完成
        if (finished) {
            NSLog(@"finished");
        }
    }];
    */
    //第三种Block
    /*
    [UIView animateWithDuration:2 delay:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
//        设置要修改的View属性
        self.changeView.backgroundColor = [UIColor orangeColor];
    } completion:^(BOOL finished) {
        //finished判断动画是否完成
        if (finished) {
            NSLog(@"finished");
        }
    }];
     */
    //对过度动画的封装
    //参数1: 改变的View 参数2:动画时长 参数3:动画类型 参数4 Block: 设置要修改的View属性 参数5:完成后的操作
    [UIView transitionWithView:self.changeView duration:2 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
        self.changeView.backgroundColor = [UIColor orangeColor];
    } completion:^(BOOL finished) {
        //finished判断动画是否完成
        if (finished) {
            NSLog(@"finished");
        }
    }];
}
 
#pragma mark - AnimationDelegate
//动画将要开始时调用
- (void)animationWillStart:(NSString *)animationID context:(void *)context
{
    NSLog(@"start: %@, %@", animationID, context);
}
 
//动画结束时调用
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    NSLog(@"stop: %@, %@", animationID, context);
}
 
- (void)startAnimation
{
    NSLog(@"self");
}
 
 
#import "SecondVC.h"
@implementation SecondVC
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    NSLog(@"%@", NSStringFromCGRect(self.changeView.frame));
    NSLog(@"%f", CGRectGetWidth(self.changeView.frame));
    //UIView和CALayer的关系
    //UIView负责交互, frame以及显示CALayer
    //CALayer负责渲染, 并且它是UIView的一个readonly属性
    /*
    self.changeView.layer.cornerRadius = 100;//设置圆角, 参数是内切圆的半径, 若想画一个圆, 前提是view必须是正方形, 参数应该是view边长的一半
    self.changeView.layer.borderWidth = 1;//设置描边的宽度
    self.changeView.layer.borderColor = [UIColor orangeColor].CGColor;//设置描边的颜色(UIView上的颜色使用的是UIColor, CALayer上使用的颜色是CGColor)
    self.changeView.layer.shadowOffset = CGSizeMake(50, 100);//设置阴影的偏移量 width影响水平偏移(正右负左), height影响垂直偏移(正下负上)
    self.changeView.layer.shadowColor = [UIColor grayColor].CGColor;//阴影的偏移的颜色
    self.changeView.layer.shadowOpacity = 1;//阴影的不透明度, 取值范围(0 ~ 1), 默认是0, 就是透明的
     */
//    CAAnimation抽象类, 使用必须要使用其具体的子类
//    CAPropertyAnimation抽象子类, 需要子类化
//    CABasicAnimation
//    CAKeyframeAnimation
}
 
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
 
- (void)dealloc {
    [_changeView release];
    [super dealloc];
}
//CABasicAnimation基本动画 没有真正的修改属性值
- (IBAction)pressBasicAnimation:(id)sender {
    //1 创建并指定要修改的属性
//    KeyPath:CAlayer的属性名, 不是所有的属性都可以, 只有在头文件中出现animatable的属性才可以, 可以修改属性的属性, 例如:bounds.size
//    CALayer
    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"bounds"];
    [basic setDuration:2];
    //2 修改属性值
    basic.fromValue = [NSValue valueWithCGRect:CGRectMake(00, self.changeView.bounds.size.width, self.changeView.bounds.size.height)];
    basic.toValue = [NSValue valueWithCGRect:CGRectMake(00300300)];
//    basic.byValue = 
    //3 添加动画
    //key做区分动画用
    [self.changeView.layer addAnimation:basic forKey:@"changColor"];
}
 
//CAKeyframeAnimation关键帧动画
- (IBAction)pressKeyFrameAnimation:(id)sender {
    /*
    //1 创建动画
    CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"bounds"];
    [keyFrame setDuration:2];
    //2 修改属性
    keyFrame.values = @[[NSValue valueWithCGRect:CGRectMake(0, 0, self.changeView.bounds.size.width, self.changeView.bounds.size.height)], [NSValue valueWithCGRect:CGRectMake(0, 0, 250, 250)], [NSValue valueWithCGRect:CGRectMake(0, 0, 300, 300)]];
//    keyTimes:值代表了出现动画的时刻, 值得范围是0~1, 值必须是递增的, keyTimes和values是一一对应的
    keyFrame.keyTimes = @[@(0.4), @(0.6), @(1)];
    //3 添加动画
    [self.changeView.layer addAnimation:keyFrame forKey:@"keyFrame"];
    */
    CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"backgroundColor"];
    [keyFrame setDuration:10];
    keyFrame.values = @[(id)[UIColor redColor].CGColor, (id)[UIColor orangeColor].CGColor, (id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor, (id)[UIColor blueColor].CGColor];
    //keyTimes中的第一个值是0, 不能修改
    keyFrame.keyTimes = @[@(0.3), @(0.5), @(0.6), @(0.7), @(0.9)];
    [self.changeView.layer addAnimation:keyFrame forKey:nil];
}
 
//    CATransaction 过度动画
- (IBAction)pressTransition:(id)sender {
    //1 创建
    CATransition *transition = [CATransition animation];
    [transition setDuration:2];
    //2 设置过度样式
    transition.type = kCATransitionReveal;//控制样式
    transition.subtype = kCATransitionFromTop;//控制方向
    //添加动画
    [self.changeView.layer addAnimation:transition forKey:nil];
}
 
//    CAAnimationGroup 组动画
- (IBAction)pressAnimationGroup:(id)sender {
     
    //1 创建并指定要修改的属性
    //    KeyPath:CAlayer的属性名, 不是所有的属性都可以, 只有在头文件中出现animatable的属性才可以, 可以修改属性的属性, 例如:bounds.size
    //    CALayer
    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"bounds"];
    [basic setDuration:2];
    //2 修改属性值
    basic.fromValue = [NSValue valueWithCGRect:CGRectMake(00, self.changeView.bounds.size.width, self.changeView.bounds.size.height)];
    basic.toValue = [NSValue valueWithCGRect:CGRectMake(00300300)];
     
    CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"backgroundColor"];
    [keyFrame setDuration:5];
    keyFrame.values = @[(id)[UIColor redColor].CGColor, (id)[UIColor orangeColor].CGColor, (id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor, (id)[UIColor blueColor].CGColor];
    //keyTimes中的第一个值是0, 不能修改
    keyFrame.keyTimes = @[@(0.3), @(0.5), @(0.6), @(0.7), @(0.9)];
     
     
     
    // 创建
    //当group动画的时长 > 组中所有动画的最长时长, 动画的时长以组中最长的时长为准
    //当group动画的时长 < 组中所有动画的最长时长, 动画的时长以group的时长为准
    //最合适: group的时长 = 组中所有动画的最长时长
    CAAnimationGroup *group = [CAAnimationGroup animation];
    [group setDuration:10];
    //设置组动画
    group.animations = @[basic, keyFrame];
    //添加动画
    [self.changeView.layer addAnimation:group forKey:nil];
}
@end

ios 关于动画用法的总结的更多相关文章

  1. iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题

    本文转载至 http://www.tuicool.com/articles/aANBF3m 时间 2014-12-07 20:13:37  segmentfault-博客原文  http://segm ...

  2. iOS核心动画学习整理

    最近利用业余时间终于把iOS核心动画高级技巧(https://zsisme.gitbooks.io/ios-/content/chapter1/the-layer-tree.html)看完,对应其中一 ...

  3. IOS 核心动画之CAKeyframeAnimation - iBaby

    - IOS 核心动画之CAKeyframeAnimation - 简单介绍 是CApropertyAnimation的子类,跟CABasicAnimation的区别是:CABasicAnimation ...

  4. iOS各种动画效果

    ios各种动画效果 最普通动画: //开始动画 [UIView beginAnimations:nil context:nil];  //设定动画持续时间 [UIView setAnimationDu ...

  5. IOS之动画

    IOS之动画   15.1 动画介绍 15.2 Core Animation基础 15.3 隐式动画 15.4 显式动画 15.5 关键帧显式动画 15.6 UIView级别动画 15.1 动画介绍 ...

  6. IOS NSUserDefaults 讲解 用法

    IOS NSUserDefaults 讲解 用法    NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults ...

  7. IOS 动画专题 --iOS核心动画

    iOS开发系列--让你的应用“动”起来 --iOS核心动画 概览 通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看 ...

  8. ios 学习动画的套路 (一)

    你也肯定喜欢炫酷的动画! 在APP中,动画就是一个点睛之笔!可以给用户增加一些独特的体验感,估计也有许多的和我一样的,看着那些觉得不错的动画,也就只能流口水的孩子,毕竟~不知道从哪里下手去写!会连续的 ...

  9. Bodymovin:Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画

    转自:https://www.cnblogs.com/zamhown/p/6688369.html 大杀器Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画 ...

随机推荐

  1. VMware 如何通过现有虚拟机克隆新的虚拟机 (图文)

    本文做的是克隆主机,并重命名主机名,做好主机名与IP的对应关系,并可以通过主机名访问对方的主机. 首先说一下克隆虚拟机的作用 克隆虚拟机的作用 因工作需要,需要用到多个虚拟机环境时,再新建几个比较麻烦 ...

  2. 【BZOJ1412】狼和羊的故事(最小割)

    题意:将一个由0,1,2构成的矩阵里的1与2全部分割最少需要选取多少条边 n,m<=100 思路:裸的最小割模型 相邻的格子连容量为1的边(其实可以少连很多遍,1与1,2与2之间的边是没有意义的 ...

  3. .net core 使用 codegenerator 创建默认CRUD代码

    dotnet.exe aspnet-codegenerator controller --force --controllerName [controller-name] --relativeFold ...

  4. win10+Linux18.04双系统安装

    给好多可爱的妹子重装了那么多次电脑,懒得码过程,因为我一般每次都要查一查...这次来个综合版吧,超简单,无脑操作. 首先说一下我的电脑Thinkpad + 500G 硬盘 (2014年买的老电脑) 首 ...

  5. 洛谷——P1560 [USACO5.2]蜗牛的旅行Snail Trails

    P1560 [USACO5.2]蜗牛的旅行Snail Trails 题目描述 萨丽·斯内尔(Sally Snail,蜗牛)喜欢在N x N 的棋盘上闲逛(1 < n <= 120). 她总 ...

  6. OpenCV、PCL;Xtion、kinect;OpenNI、kinect for windows SDK比较

    一.对比介绍: 1. OpenCV:开源跨平台,OpenCV于1999年由Intel建立,如今由Willow Garage提供支持. 2. OpenNI:OpenNI组织创建于2010年11月.主要成 ...

  7. gcc、arm-Linux-gcc和arm-elf-gcc的组成及区别

    2017-01-19 嵌入式ARM 嵌入式ARM 一.GCC简介 The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,为什么是编辑器集而不是编译 ...

  8. 配置maven从私服上下载构件

    maven 本地setting.xml配置 <!--配置maven从私服上下载构件 --> <profiles> <profile> <repositorie ...

  9. 使用UltraISO刻录自己的音乐CD步骤

    1.文件->新建->音乐光盘映像. 2.在左下方,“本地目录”中,找到音乐所在目录,右下方会出现mp3等音乐文件. 3.在右下方,点击音乐文件,右键选“添加”.音乐文件会出现在右上方窗口里 ...

  10. 利用反射技术实现POJO的数据库操作

    记得第一次写项目的时候,傻傻的数据库一张表,代码里就写一个DAO类,几张表就写几个DAO类,大量的反复代码,自己粘着都嫌烦,后来接触了Hibernate,不得不说对我们这样的小白用处还是非常大的.那么 ...