• 关键帧动画


    参考网址:

    http://www.jianshu.com/p/b05986ded337
    http://www.jianshu.com/p/69f9b00dabdc

     

    #import "ViewController.h"
    
    #define K_SCREEN_W [UIScreen mainScreen].bounds.size.width
    #define K_SCREEN_H [UIScreen mainScreen].bounds.size.height
    
    @interface ViewController ()
    
    @property (weak, nonatomic) IBOutlet UIView *greenView;
    @property (nonatomic, weak) CALayer *redLayer;
    - (IBAction)SegueDetailClick:(UIButton *)sender;
    
    @end
    
    @implementation ViewController
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        /**
         * 
         概念:关键帧动画-CAKeyframeAnimation
         与基础动画的区别:
            基础动画只能是某个属性的初始值到另一个值产生动画效果;
            关键帧动画支持多个值(values)或者一个路径(path)
         */
        // 1. 添加redLayer图层 到view.layer上
        [self addRedLayer];
    }
    
    
    - (void)addRedLayer{
        
        CALayer *layer = [CALayer layer];
        _redLayer = layer;
        layer.backgroundColor = [UIColor redColor].CGColor;
        CGFloat la_w = 100;
        CGFloat la_h = la_w;
        CGFloat la_x = (K_SCREEN_W - la_w)/2;
        CGFloat la_y = (K_SCREEN_H - la_h)/2;
        layer.frame = CGRectMake(la_x, la_y, la_w, la_h);
        [self.view.layer addSublayer:_redLayer];
    }
    
    - (void)touchesBegan:(nonnull NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{
        
        /** 2. 绿色的view,椭圆路径位移  */
        [self positionChange];
        /** _redLayer 抖动 动画 */
        [self anim];
    }
    
    - (void)positionChange{
        
        CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
        anim.keyPath = @"position";
        anim.duration = 1;
        anim.repeatCount = MAXFLOAT;
            // 取消反弹
        // 告诉在动画结束的时候不要移除
        anim.removedOnCompletion = NO;
        // 始终保持最新的效果
        anim.fillMode = kCAFillModeForwards;
        
        
        CGFloat pa_w = 250;
        CGFloat pa_h = pa_w;
        CGFloat padding = 60;
        CGFloat pa_x = padding;
        CGFloat pa_y = (K_SCREEN_H - pa_w)/2;
        // Oval 椭圆  路径轨迹
        anim.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(pa_x, pa_y, pa_w, pa_h)].CGPath;
        // 将动画对象添加到 绿色视图的layer上去
        [_greenView.layer addAnimation:anim forKey:nil];
    }
    
    
    /**
     * _redLayer 抖动动画
     */
    - (void)anim{
        
        CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
        anim.duration = 0.3;
        anim.keyPath = @"transform";
        NSValue *value =  [NSValue valueWithCATransform3D:CATransform3DMakeRotation((-15) / 180.0 * M_PI, 0, 0, 1)];
        NSValue *value1 =  [NSValue valueWithCATransform3D:CATransform3DMakeRotation((15) / 180.0 * M_PI, 0, 0, 1)];
        NSValue *value2 =  [NSValue valueWithCATransform3D:CATransform3DMakeRotation((-15) / 180.0 * M_PI, 0, 0, 1)];
        anim.values = @[value,value1,value2];
        anim.repeatCount = MAXFLOAT;
        [_redLayer addAnimation:anim forKey:nil];
    }
    
    
    
    
    
    - (IBAction)SegueDetailClick:(UIButton *)sender {
        
        [self performSegueWithIdentifier:@"SegueDetail" sender:self];
    }
    @end
    
  • 相关阅读:
    使用 Redis 实现分布式锁(转载)
    使用Redis SETNX 命令实现分布式锁(转载)
    linux目录(转载)
    sleep函数作用(转)
    大数据量高并发的数据库优化(转)
    java获取request的url方法区别
    java获取request的头信息
    打分排序系统漫谈2
    打分排序系统漫谈1
    Tree
  • 原文地址:https://www.cnblogs.com/superbobo/p/5508645.html
Copyright © 2020-2023  润新知