• 核心动画06-时钟(了解)


    //  ViewController.m
    //  06-时钟(了解)
    #import "ViewController.h"
    #define kClockW _clockView.bounds.size.width
    
    
    #define angle2radion(a) ((a) / 180.0 * M_PI)
    // 一秒钟秒针转6°
    #define perSecondA 6
    
    // 一分钟分针转6°
    #define perMinuteA 6
    
    
    // 一小时时针转30°
    #define perHourA 30
    
    // 每分钟时针转多少度
    #define perMinuteHourA 0.5
    
    
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIImageView *clockView;
    
    @property (nonatomic, weak) CALayer *secondLayer;
    
    @property (nonatomic, weak) CALayer *minuteLayer;
    
    @property (nonatomic, weak) CALayer *hourLayer;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        // 添加时针
        [self setUpHourLayer];
        
        // 添加分针
        [self setUpMinuteLayer];
        
        // 添加秒针
        [self setUpSecondLayer];
        
        
        // 添加定时器
        [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
        
        [self timeChange];
        
    }
    
    - (void)timeChange
    {
        // 获取当前的系统的时间
        
        // 获取当前日历对象
        NSCalendar *calendar = [NSCalendar currentCalendar];
        
        // 获取日期的组件:年月日小时分秒
        // components:需要获取的日期组件
        // fromDate:获取哪个日期的组件
        // 经验:以后枚举中有移位运算符,通常一般可以使用并运算(|)
        NSDateComponents  *cmp = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];
        
        // 获取秒
        NSInteger second = cmp.second;
        
        // 获取分
        NSInteger minute = cmp.minute;
        
        // 获取小时
        NSInteger hour = cmp.hour;
        
        // 计算秒针转多少度
        CGFloat secondA = second * perSecondA;
        
        // 计算分针转多少度
        CGFloat minuteA = minute * perMinuteA;
        
        // 计算时针转多少度
        CGFloat hourA = hour * perHourA + minute * perMinuteHourA;
        
        // 旋转秒针
        _secondLayer.transform = CATransform3DMakeRotation(angle2radion(secondA), 0, 0, 1);
        
        // 旋转分针
        _minuteLayer.transform = CATransform3DMakeRotation(angle2radion(minuteA), 0, 0, 1);
        
        // 旋转小时
        _hourLayer.transform = CATransform3DMakeRotation(angle2radion(hourA), 0, 0, 1);
    }
    #pragma mark - 添加秒针
    - (void)setUpSecondLayer
    {
       CALayer *secondL = [CALayer layer];
        
        secondL.backgroundColor = [UIColor redColor].CGColor;
        
        // 设置锚点
        secondL.anchorPoint = CGPointMake(0.5, 1);
        
        secondL.position = CGPointMake(kClockW * 0.5, kClockW * 0.5);
        
        secondL.bounds = CGRectMake(0, 0, 1, kClockW * 0.5 - 20);
        
        
        
        [_clockView.layer addSublayer:secondL];
        
        _secondLayer = secondL;
    }
    
    
    #pragma mark - 添加分针
    - (void)setUpMinuteLayer
    {
        CALayer *layer = [CALayer layer];
        
        layer.backgroundColor = [UIColor blackColor].CGColor;
        
        // 设置锚点
        layer.anchorPoint = CGPointMake(0.5, 1);
        
        layer.position = CGPointMake(kClockW * 0.5, kClockW * 0.5);
        
        layer.bounds = CGRectMake(0, 0, 4, kClockW * 0.5 - 20);
        
        layer.cornerRadius = 4;
        
        
        [_clockView.layer addSublayer:layer];
        
        _minuteLayer = layer;
    }
    
    #pragma mark - 添加时针
    - (void)setUpHourLayer
    {
        CALayer *layer = [CALayer layer];
        
        layer.backgroundColor = [UIColor blackColor].CGColor;
        
        // 设置锚点
        layer.anchorPoint = CGPointMake(0.5, 1);
        
        layer.position = CGPointMake(kClockW * 0.5, kClockW * 0.5);
        
        layer.bounds = CGRectMake(0, 0, 4, kClockW * 0.5 - 40);
        
        layer.cornerRadius = 4;
        
        
        [_clockView.layer addSublayer:layer];
        
        _hourLayer = layer;
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end

    核心动画

    //
    //  ViewController.m
    //  07-核心动画-CABasicAnimation
    #import "ViewController.h"
    
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIView *redView;
    @property (weak, nonatomic) IBOutlet UIImageView *imageV;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        
        
        
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        // 创建动画
        CABasicAnimation *anim = [CABasicAnimation animation];
        
        // 描述下修改哪个属性产生动画
    //    anim.keyPath = @"position";
        // 只能是layer属性
        anim.keyPath = @"transform.scale";
        
        // 设置值
    //    anim.toValue = [NSValue valueWithCGPoint:CGPointMake(250, 500)];
        
        anim.toValue = @0.5;
        
        // 设置动画执行次数
        anim.repeatCount = MAXFLOAT;
        
        // 取消动画反弹
        // 设置动画完成的时候不要移除动画
        anim.removedOnCompletion = NO;
        
        // 设置动画执行完成要保持最新的效果
        anim.fillMode = kCAFillModeForwards;
        
        [_imageV.layer addAnimation:anim forKey:nil];
        
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end

     08-核心动画-CAKeyFrameAnimation 

    //  ViewController.m
    //  08-核心动画-CAKeyFrameAnimation
    #import "ViewController.h"
    #define angle2Radion(angle) (angle / 180.0 * M_PI)
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
    
    @end
    
    @implementation ViewController
    
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    //    _imageView.layer.anchorPoint = CGPointZero;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    //
    //  DrawView.m
    //  08-核心动画-CAKeyFrameAnimation
    #import "DrawView.h"
    
    @interface DrawView ()
    
    @property (nonatomic, strong) UIBezierPath *path;
    
    @end
    
    @implementation DrawView
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        // touch
        UITouch *touch = [touches anyObject];
        
        // 获取手指的触摸点
        CGPoint curP = [touch locationInView:self];
        
        // 创建路径
        UIBezierPath *path = [UIBezierPath bezierPath];
        _path = path;
        
        // 设置起点
        [path moveToPoint:curP];
        
    }
    
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        // touch
        UITouch *touch = [touches anyObject];
        
        // 获取手指的触摸点
        CGPoint curP = [touch locationInView:self];
        
        [_path addLineToPoint:curP];
        
        [self setNeedsDisplay];
    }
    
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    {
        // 给imageView添加核心动画
        // 添加核心动画
        
        CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];
        
        
        anim.keyPath = @"position";
        
        //    anim.values = @[@(angle2Radion(-10)),@(angle2Radion(10)),@(angle2Radion(-10))];
        
        anim.path = _path.CGPath;
        
        anim.duration = 1;
        
        anim.repeatCount = MAXFLOAT;
        
        [[[self.subviews firstObject] layer] addAnimation:anim forKey:nil];
    }
    
    - (void)drawRect:(CGRect)rect
    {
        [_path stroke];
    }
    
    @end
  • 相关阅读:
    leetcode-----75. 颜色分类
    《面向机器智能的TensorFlow实践》_段菲学习资料
    事务及其ACID特性
    greenplum基本使用操作
    通过java api统计hive库下的所有表的文件个数、文件大小
    深度学习原理与TensorFlow实践_喻俨资料整理
    采集数据到HDFS
    《深入理解TensorFlow架构设计与实现原理》_彭靖田学习材料整理
    Too many open files
    子元素高度100%
  • 原文地址:https://www.cnblogs.com/laugh/p/6708754.html
Copyright © 2020-2023  润新知