使用Quartz2D实现时钟动画

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Quartz2D实现时钟动画相关的知识,希望对你有一定的参考价值。

使用Quartz2D实现时钟动画(一)

要实现时钟效果,首先将素材表盘拖入工程

 技术分享

1.定义时针、分针、秒针三个图层类成员属性

@property(nonatomic,strong)CALayer *secondLayer;
@property(nonatomic,strong)CALayer *minuteLayer;
@property(nonatomic,strong)CALayer *hourLayer;

2.建立表盘图层,设置属性,并添加到父view上

//    创建时钟layer  设置属性
    CALayer *clockLayer=[CALayer layer];
    clockLayer.contents=(__bridge id _Nullable)([UIImage imageNamed:@"05-clock"].CGImage);
    clockLayer.position=self.view.center;
    clockLayer.bounds=CGRectMake(0, 0, 150, 150);
    [self.view.layer addSublayer:clockLayer];

3.接着我们创建指针图层

3.1 创建时针图层添加到时钟图层上

 // 创建时针layer,设置图层属性
    CALayer *hourLayer=[CALayer layer];
    hourLayer.backgroundColor=[UIColor  blackColor].CGColor;
    hourLayer.bounds=CGRectMake(0, 0,4, 45);
    hourLayer.position=CGPointMake(clockLayer.bounds.size.width*0.5, clockLayer.bounds.size.height*0.5);
    hourLayer.anchorPoint=CGPointMake(0.5, 0.75);
    //  修改时针的锚点
    [clockLayer addSublayer:hourLayer];
    _hourLayer=hourLayer;

3.2 创建分针图层添加到时钟图层上

//    创建分针layer,设置图层属性
    CALayer *minuteLayer=[CALayer layer];
    minuteLayer.backgroundColor=[UIColor  redColor].CGColor;
    minuteLayer.bounds=CGRectMake(0, 0, 4, 55);
    minuteLayer.position=CGPointMake(clockLayer.bounds.size.width*0.5, clockLayer.bounds.size.height*0.5);
    minuteLayer.anchorPoint=CGPointMake(0.5, 0.75);
    //  修改分针的锚点
    [clockLayer addSublayer:minuteLayer];
    _minuteLayer=minuteLayer;

3.3 创建秒针图层添加到时钟图层上

//    创建分针layer,设置图层属性
    CALayer *minuteLayer=[CALayer layer];
    minuteLayer.backgroundColor=[UIColor  redColor].CGColor;
    minuteLayer.bounds=CGRectMake(0, 0, 4, 55);
    minuteLayer.position=CGPointMake(clockLayer.bounds.size.width*0.5, clockLayer.bounds.size.height*0.5);
    minuteLayer.anchorPoint=CGPointMake(0.5, 0.75);
    //  修改分针的锚点
    [clockLayer addSublayer:minuteLayer];
    _minuteLayer=minuteLayer; 

4.使用CADisplayLink开启定时功能,实现实时刷新数据(也可以使用NSTimer方法)。

//  开启定时器,监控时间
    CADisplayLink *link=[CADisplayLink displayLinkWithTarget:self selector:@selector(startRotate)];
    [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];

此时我们的工程界面已经搭载完毕,现在要做的时建立他们之间的关系,实现startRotate方法,让指针随着时间转动。

5.引入 NSCalendar获取现时时间

 NSCalendar *calendar=[NSCalendar currentCalendar];
   NSDateComponents *components= [calendar components:NSCalendarUnitSecond |NSCalendarUnitMinute |NSCalendarUnitHour fromDate:[NSDate date]];

  获取时间属性

   //    获取秒数
    CGFloat sec=components.second;
    //    获取分钟数
    CGFloat minute=components.minute;
    //    获取小时
    CGFloat hour=components.hour;

6.接下来,我们需要理清时针,分针,秒针之间的关系。

#define perSecondA 6  //每秒钟秒针旋转6°
#define perMinuteA 6  //每分钟分针旋转6°
#define perHourA  30  //每小时时针旋转6°
#define perMinuteHourA 0.5   //每分钟时针旋转0.5°
#define  angle2randian(x)  ((x)/180.0*M_PI)    //角度转弧度

7.算出时针,分针,秒针需要旋转的度数。

   //    算出秒针旋转了多少度
    CGFloat secondA=sec *perSecondA;
    //    算出分针旋转了多少度
    CGFloat minuteA=minute*perMinuteA;
    //   算出时针旋转了多少度
    CGFloat hourA=hour*perHourA;
   //    时针与分针建立关系
    hourA +=minute*perMinuteHourA;

 8.调用CATransform3DMakeRotation方法,实现指针跳转

self.secondLayer.transform= CATransform3DMakeRotation(angle2randian(secondA), 0, 0, 1);
  self.minuteLayer.transform=CATransform3DMakeRotation(angle2randian(minuteA), 0, 0, 1);
    self.hourLayer.transform=CATransform3DMakeRotation(angle2randian(hourA), 0, 0, 1);

最后运行工程。

 

以上是关于使用Quartz2D实现时钟动画的主要内容,如果未能解决你的问题,请参考以下文章

时钟动画

仿写及比较标哥的iOS时钟动画

Unity C#入门教程——动画时钟实现

使用嵌套片段和动画对象

Quartz2D简单使用

CSS动画篇之炫酷时钟之时钟墙