• [iOS UI进阶


    A.基本用法
    1.CABasicAnimation
      1 //
      2 //  ViewController.m
      3 //  CoreAnimationTest
      4 //
      5 //  Created by hellovoidworld on 15/1/14.
      6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
      7 //
      8 
      9 #import "ViewController.h"
     10 
     11 @interface ViewController ()
     12 
     13 @property(nonatomic, strong) CALayer *layer;
     14 
     15 @end
     16 
     17 @implementation ViewController
     18 
     19 - (void)viewDidLoad {
     20     [super viewDidLoad];
     21     // Do any additional setup after loading the view, typically from a nib.
     22    
     23 
     24     CALayer *layer = [[CALayer alloc] init];
     25     layer.bounds = CGRectMake(0, 0, 100, 100);
     26     layer.anchorPoint = CGPointZero;
     27     layer.position = CGPointMake(100, 200);
     28     layer.backgroundColor = [UIColor redColor].CGColor;
     29    
     30     [self.view.layer addSublayer:layer];
     31    
     32     self.layer = layer;
     33 }
     34 
     35 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     36 //    [self testTransform];
     37    
     38 //    [self testRotation];
     39    
     40 //    [self testScale];
     41    
     42     [self testTranslate];
     43 }
     44 
     45 /** 测试位移转换 */
     46 - (void) testTransform {
     47     // 1.创建动画对象
     48     CABasicAnimation *anim = [CABasicAnimation animation];
     49    
     50     // 2.设置动画
     51     anim.duration = 2.0;
     52     // 动画设置目标属性
     53     anim.keyPath = @"transform.translation.x";
     54     // 目标属性值
     55     anim.toValue = @(150);
     56    
     57     // 完成后保留动画
     58     anim.removedOnCompletion = NO;
     59     // 定格动画模式为最后一刻
     60     anim.fillMode = kCAFillModeForwards;
     61    
     62     // 3.添加动画到图层
     63     [self.layer addAnimation:anim forKey:nil];
     64 }
     65 
     66 /** 测试旋转 */
     67 - (void) testRotation {
     68     // 1.创建动画对象
     69     CABasicAnimation *anim = [CABasicAnimation animation];
     70    
     71     // 2.设置动画
     72     anim.duration = 2.0;
     73    
     74     // 动画设置目标属性
     75 //    anim.keyPath = @"transform.rotation";
     76     anim.keyPath = @"transform";
     77     NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 1, 1, 0)];
     78    
     79     // 目标属性值
     80 //    anim.toValue = @(M_PI_2);
     81     anim.toValue = value;
     82    
     83    
     84     // 完成后保留动画
     85     anim.removedOnCompletion = NO;
     86     // 定格动画模式为最后一刻
     87     anim.fillMode = kCAFillModeForwards;
     88    
     89     // 3.添加动画到图层
     90     [self.layer addAnimation:anim forKey:nil];
     91 }
     92 
     93 /** 测试缩放 */
     94 - (void) testScale {
     95     // 1.创建动画对象
     96     CABasicAnimation *anim = [CABasicAnimation animation];
     97    
     98     // 2.设置动画
     99     anim.duration = 2.0;
    100     // 动画设置目标属性
    101     anim.keyPath = @"bounds";
    102    
    103     // 由于属性是bounds,所以x,y属性是无用的,并且要使用CGRect
    104     NSValue *fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 0, 0)];
    105     NSValue *toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
    106    
    107     // 目标属性值
    108     anim.fromValue = fromValue;
    109     anim.toValue = toValue;
    110    
    111     // 完成后保留动画
    112     anim.removedOnCompletion = NO;
    113     // 定格动画模式为最后一刻
    114     anim.fillMode = kCAFillModeForwards;
    115    
    116     // 3.添加动画到图层
    117     [self.layer addAnimation:anim forKey:nil];
    118 }
    119 
    120 - (void) testTranslate {
    121     // 1.创建动画对象
    122     CABasicAnimation *anim = [CABasicAnimation animation];
    123    
    124     // 2.设置动画
    125     anim.duration = 2.0;
    126     // 动画设置目标属性
    127     anim.keyPath = @"position";
    128    
    129     // 目标属性值
    130     NSValue *value = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
    131     // 增减目标属性值,所以一直点击就会一直移动下去
    132     anim.byValue = value;
    133    
    134     // 完成后保留动画
    135     anim.removedOnCompletion = NO;
    136     // 定格动画模式为最后一刻
    137     anim.fillMode = kCAFillModeForwards;
    138    
    139     // 3.添加动画到图层
    140     [self.layer addAnimation:anim forKey:nil];
    141 }
    142 
    143 
    144 - (void)didReceiveMemoryWarning {
    145     [super didReceiveMemoryWarning];
    146     // Dispose of any resources that can be recreated.
    147 }
    148  
    149 @end
     
    2.CAKeyframeAnimation
    CAKeyframeAnimation
     
      1 //
      2 //  KeyframeViewController.m
      3 //  CoreAnimationTest
      4 //
      5 //  Created by hellovoidworld on 15/1/15.
      6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
      7 //
      8 
      9 #import "KeyframeViewController.h"
     10 
     11 @interface KeyframeViewController ()
     12 
     13 @property(nonatomic, strong) CALayer *layer;
     14 
     15 @end
     16 
     17 @implementation KeyframeViewController
     18 
     19 - (void)viewDidLoad {
     20     [super viewDidLoad];
     21     // Do any additional setup after loading the view.
     22    
     23     CALayer *layer = [[CALayer alloc] init];
     24     layer.bounds = CGRectMake(0, 0, 100, 100);
     25     layer.anchorPoint = CGPointZero;
     26     layer.position = CGPointMake(200, 100);
     27     layer.backgroundColor = [UIColor redColor].CGColor;
     28    
     29     [self.view.layer addSublayer:layer];
     30    
     31     self.layer = layer;
     32 }
     33 
     34 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     35 //    [self testPath];
     36  
     37     [self testMutiValue];
     38 }
     39 
     40 - (void) testPath {
     41     // 创建动画对象
     42     CAKeyframeAnimation *anim = [[CAKeyframeAnimation alloc] init];
     43    
     44     // 设置动画
     45     anim.keyPath = @"position";
     46     anim.removedOnCompletion = NO;
     47     anim.fillMode = kCAFillModeForwards;
     48     anim.duration = 2.0;
     49    
     50     // 设置绘画路径
     51     CGMutablePathRef path = CGPathCreateMutable();
     52     // 创建一个圆的轨迹
     53     CGPathAddEllipseInRect(path, NULL, CGRectMake(0, 0, 200, 200));
     54     // 设置动画轨迹
     55     anim.path = path;
     56     // 释放路径
     57     CGPathRelease(path);
     58    
     59     // 设置动画代理
     60     anim.delegate = self;
     61    
     62     [self.layer addAnimation:anim forKey:nil];
     63 }
     64 
     65 - (void) testMutiValue {
     66     // 创建动画对象
     67     CAKeyframeAnimation *anim = [[CAKeyframeAnimation alloc] init];
     68    
     69     // 设置动画
     70     anim.keyPath = @"position";
     71     anim.removedOnCompletion = NO;
     72     anim.fillMode = kCAFillModeForwards;
     73     anim.duration = 2.0;
     74    
     75     NSValue *v1 = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
     76     NSValue *v2 = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
     77     NSValue *v3 = [NSValue valueWithCGPoint:CGPointMake(300, 200)];
     78     NSValue *v4 = [NSValue valueWithCGPoint:CGPointMake(120, 50)];
     79    
     80     anim.values = @[v1, v2, v3, v4];
     81    
     82     //  设置动画节奏
     83     // 慢进慢出
     84     anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
     85    
     86     // 设置动画代理
     87     anim.delegate = self;
     88    
     89     [self.layer addAnimation:anim forKey:nil];
     90 }
     91 
     92 #pragma mark - 动画代理方法
     93 /** 动画开始之后 */
     94 - (void)animationDidStart:(CAAnimation *)anim {
     95     NSLog(@"animationDidStart");
     96 }
     97 
     98 /** 动画结束 */
     99 - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
    100     NSLog(@"animationDidStop");
    101 }
    102 
    103 
    104 @end
     
    3.控件抖动
    AnimationShake
     
     1 //
     2 //  ShakeViewController.m
     3 //  CoreAnimationTest
     4 //
     5 //  Created by hellovoidworld on 15/1/15.
     6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
     7 //
     8 
     9 #import "ShakeViewController.h"
    10 
    11 @interface ShakeViewController ()
    12 
    13 @property(nonatomic, strong) UIImageView *imageView;
    14 
    15 @end
    16 
    17 @implementation ShakeViewController
    18 
    19 - (void)viewDidLoad {
    20     [super viewDidLoad];
    21     // Do any additional setup after loading the view.
    22    
    23     UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"headImage"]];
    24     imageView.frame = CGRectMake(100, 100, 100, 100);
    25     self.imageView = imageView;
    26    
    27     UIButton *startButton = [UIButton buttonWithType:UIButtonTypeSystem];
    28     [startButton setTitle:@"开始" forState:UIControlStateNormal];
    29     startButton.frame = CGRectMake(50, 50, 40, 50);
    30     [startButton addTarget:self action:@selector(startShake) forControlEvents:UIControlEventTouchUpInside];
    31    
    32     UIButton *stopButton = [UIButton buttonWithType:UIButtonTypeSystem];
    33     [stopButton setTitle:@"停止" forState:UIControlStateNormal];
    34     stopButton.frame = CGRectMake(150, 50, 40, 50);
    35     [stopButton addTarget:self action:@selector(stopShake) forControlEvents:UIControlEventTouchUpInside];
    36    
    37     [self.view addSubview:imageView];
    38     [self.view addSubview:startButton];
    39     [self.view addSubview:stopButton];
    40 }
    41 
    42 /** 开始摆动 */
    43 - (void) startShake {
    44     NSLog(@"start shake");
    45    
    46     // 创建动画
    47     CAKeyframeAnimation *anim = [[CAKeyframeAnimation alloc] init];
    48     anim.keyPath = @"transform.rotation";
    49     anim.repeatCount = MAXFLOAT;
    50     anim.duration = 0.2;
    51    
    52     // 设置摇摆
    53     anim.values = @[@(- (M_PI/180 * 5)), @((M_PI/180 * 5)), @(- (M_PI/180 * 5))];
    54   
    55     // 定格动画
    56     anim.removedOnCompletion = NO;
    57     anim.fillMode = kCAFillModeForwards;
    58    
    59     // 给view加上动画
    60     [self.imageView.layer addAnimation:anim forKey:@"shake"];
    61 }
    62 
    63 /** 停止摆动 */
    64 - (void) stopShake {
    65     NSLog(@"stop shake");
    66    
    67     [self.imageView.layer removeAnimationForKey:@"shake"];
    68 }
    69  
    70 @end
     
    4.过渡效果
    AnimationTransition
     
     1 //
     2 //  TransitionViewController.m
     3 //  CoreAnimationTest
     4 //
     5 //  Created by hellovoidworld on 15/1/15.
     6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
     7 //
     8 
     9 #import "TransitionViewController.h"
    10 
    11 @interface TransitionViewController ()
    12 
    13 @property(nonatomic, strong) UIImageView *imageView;
    14 
    15 @property(nonatomic, assign) int imageIndex;
    16 
    17 @end
    18 
    19 @implementation TransitionViewController
    20 
    21 - (void)viewDidLoad {
    22     [super viewDidLoad];
    23     // Do any additional setup after loading the view.
    24    
    25     self.imageIndex = 0;
    26     UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"1"]];
    27     imageView.frame = CGRectMake(80, 50, 160, 240);
    28     self.imageView = imageView;
    29    
    30     UIButton *startButton = [UIButton buttonWithType:UIButtonTypeSystem];
    31     [startButton setTitle:@"上一张" forState:UIControlStateNormal];
    32     startButton.frame = CGRectMake(50, 400, 80, 50);
    33     [startButton addTarget:self action:@selector(preImage) forControlEvents:UIControlEventTouchUpInside];
    34    
    35     UIButton *stopButton = [UIButton buttonWithType:UIButtonTypeSystem];
    36     [stopButton setTitle:@"下一张" forState:UIControlStateNormal];
    37     stopButton.frame = CGRectMake(150, 400, 80, 50);
    38     [stopButton addTarget:self action:@selector(nextImage) forControlEvents:UIControlEventTouchUpInside];
    39    
    40     [self.view addSubview:imageView];
    41     [self.view addSubview:startButton];
    42     [self.view addSubview:stopButton];
    43 }
    44 
    45 /** 上一张 */
    46 - (void) preImage {
    47     NSLog(@"preImage");
    48    
    49     self.imageIndex--;
    50     if (self.imageIndex == -1) {
    51         self.imageIndex = 8;
    52     }
    53    
    54     CATransition *anim = [[CATransition alloc] init];
    55     anim.duration = 0.5;
    56     anim.type = @"cube";
    57     anim.subtype = kCATransitionFromLeft;
    58    
    59     [self.imageView.layer addAnimation:anim forKey:nil];
    60    
    61     [self changeImage:self.imageIndex];
    62 }
    63 
    64 /** 下一张 */
    65 - (void) nextImage {
    66     NSLog(@"nextImage");
    67    
    68     self.imageIndex++;
    69     if (self.imageIndex == 9) {
    70         self.imageIndex = 0;
    71     }
    72    
    73     CATransition *anim = [[CATransition alloc] init];
    74     anim.duration = 0.5;
    75     anim.type = @"cube";
    76     anim.subtype = kCATransitionFromRight;
    77    
    78     [self.imageView.layer addAnimation:anim forKey:nil];
    79    
    80     [self changeImage:self.imageIndex];
    81 }
    82 
    83 /** 替换图片 */
    84 - (void) changeImage:(int) imageIndex {
    85     NSString *imageName = [NSString stringWithFormat:@"%d", self.imageIndex + 1];
    86     self.imageView.image = [UIImage imageNamed:imageName];
    87 }
    88 
    89 @end
     
    5.CAAnimationGroup 动画组(组合多种动画)
    AnimationGroup
     
     1 //
     2 //  GroupViewController.m
     3 //  CoreAnimationTest
     4 //
     5 //  Created by hellovoidworld on 15/1/15.
     6 //  Copyright (c) 2015年 hellovoidworld. All rights reserved.
     7 //
     8 
     9 #import "GroupViewController.h"
    10 
    11 @interface GroupViewController ()
    12 
    13 @property(nonatomic, strong) UIView *hvwView;
    14 
    15 @end
    16 
    17 @implementation GroupViewController
    18 
    19 - (void)viewDidLoad {
    20     [super viewDidLoad];
    21     // Do any additional setup after loading the view.
    22    
    23     UIView *hvwView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    24     hvwView.backgroundColor = [UIColor redColor];
    25     self.hvwView = hvwView;
    26    
    27     [self.view addSubview:hvwView];
    28 }
    29 
    30 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    31     // 平移
    32     CABasicAnimation *anim1 = [[CABasicAnimation alloc] init];
    33     anim1.keyPath = @"position";
    34     anim1.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 300)];
    35    
    36     // 旋转
    37     CABasicAnimation *anim2 = [[CABasicAnimation alloc] init];
    38     anim2.keyPath = @"transform.rotation";
    39     anim2.toValue = @(M_PI_2);
    40    
    41     // 缩放
    42     CABasicAnimation *anim3 = [[CABasicAnimation alloc] init];
    43     anim3.keyPath = @"bounds";
    44     anim3.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
    45    
    46     // group动画
    47     CAAnimationGroup *animGroup = [[CAAnimationGroup alloc] init];
    48     animGroup.animations = @[anim1, anim2, anim3];
    49     animGroup.duration = 2.0;
    50    
    51     // 定格动画
    52     animGroup.removedOnCompletion = NO;
    53     animGroup.fillMode = kCAFillModeForwards;
    54    
    55     [self.hvwView.layer addAnimation:animGroup forKey:nil];
    56 }
    57  
    58 @end
     
     
  • 相关阅读:
    接入微信公众平台开发之用户关注(取消)事件触发后台自定义消息体通知给用户的实现过程
    谈缓存数据库在web开发中的重要性
    在linux服务器下日志提取的python脚本(实现输入开始时间和结束时间打包该时间段内的文件)
    关于java多线程任务执行时共享资源加锁的方式思考
    关于近期开发中遇到的同一账户多人登录造成数据库数据不一致的思考和解决(避开了数据库存状态的常用处理手段)
    spingmvc实现在程序启动时调用数据库数据
    一个前端统计图,柱形图,饼状图,折线图的前端链接
    取得ascii的例子
    BCB 延时DelayTime
    C++ Builder中串口通讯的经验之谈
  • 原文地址:https://www.cnblogs.com/hellovoidworld/p/4227949.html
Copyright © 2020-2023  润新知