iOS核心动画 一一 钟表

本文源代码请参考: https://github.com/coderZYGui/ZYClocks

效果如下图:


实现思路:

 1. (秒针) 根据CALayer创建一个secLayer,让secLayer旋转,默认是绕着锚点(0.5,0.5)旋转(中心),
     显然要修改锚点的位置为secLayer的底部,因此设置锚点为(0.5,1).

 2. 创建NSTimer对象,每1s做旋转操作.

 2. 当secLayer旋转,要计算当前旋转度是多少 = 当前的时间 * 每秒旋转的度数.

 3. 当前的时间, 要根据日历类(NSCalendar)来创建,然后获得当前的 时,分,秒等.

 4. 角度转为弧度. #define angle2Rad(angle) ((angle) / 180.0 * M_PI).

 注意: 

     1. 当计算时针角度时,应加上 当每一分钟时针应该走多少度.

     2. 另外所有的旋转,缩放都是绕着锚点形变.


代码不多,想要源码的可去我Github中下载.

ViewController文件.


#import "ViewController.h"
// 时钟宽的一半
#define COLOCKW self.clockV.bounds.size.width * 0.5
// 时钟高的一半
#define COLOCKH self.clockV.bounds.size.height * 0.5
// 每一秒走多少度
#define everySecondAngle 6
// 每一分走多少度
#define everyMinuteAngle 6
// 每时走多少度
#define everyHourAngle 30
// 每一分钟时针走多少度
#define everMinHourAngle 0.5
// 角度转弧度
#define angle2Rad(angle) ((angle) / 180.0 * M_PI)

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIImageView *clockV;

@property (weak, nonatomic) IBOutlet UIView *blackV;

@property (nonatomic, weak) CALayer *secLayer;

@property (nonatomic, weak) CALayer *minLayer;

@property (nonatomic, weak) CALayer *hourLayer;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //    [self setHour];
    //    [self setMinute];
    //    [self setSecond];
    
    // 添加时针
    self.hourLayer = [self createTimeLayer:CGRectMake(0, 0, 4, 50) color:[UIColor blackColor]];
    
    // 添加分针
    self.minLayer = [self createTimeLayer:CGRectMake(0, 0, 4, 70) color:[UIColor blackColor]];
    
    // 添加秒针
    self.secLayer = [self createTimeLayer:CGRectMake(0, 0, 2, 80) color:[UIColor redColor]];
    
    // 添加定时器
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];
    // 因为上面的定时器方法隔一秒才会调用,所以先调用一次
    [self timeChange];
    
    self.blackV.layer.cornerRadius = self.blackV.bounds.size.width * 0.5;
    
}

- (void)timeChange
{
    // 获取当前日历
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents * cmp = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];
    // 获取当前多少秒
    NSInteger curSec = cmp.second;
    // 获取当前分
    NSInteger curMin = cmp.minute;
    // 获取当前时
    NSInteger curHour = cmp.hour;
    
    // 秒针开始旋转
    // 计算秒针的角度 = 当前秒 * 每秒转的角度
    self.secLayer.transform = [self setTimeAngle:(curSec * everySecondAngle)];
    
    // 分针开始旋转
    // 计算分针角度 = 当前分 * 每分钟转的角度
    self.minLayer.transform = [self setTimeAngle:(curMin * everyMinuteAngle)];
    
    // 时针针开始旋转
    // 计算时针的角度 = 当前时 * 每小时转的角度 + 当前分 * 每一分时针转的角度
    self.hourLayer.transform = [self setTimeAngle:(curHour * everyHourAngle + curMin * everMinHourAngle)];
    
}

/**
 设置针角度
 
 @param angle 角度
 @return CATransform3D
 */
- (CATransform3D)setTimeAngle:(CGFloat)angle
{
    return CATransform3DMakeRotation(angle2Rad(angle), 0, 0, 1);
}

/**
 创建三个针
 
 @param frame 大小
 @param backgroundColor 背景颜色
 @return CALayer
 */
- (CALayer *)createTimeLayer:(CGRect)frame color:(UIColor *)backgroundColor
{
    CALayer *timpLayer = [CALayer layer];
    timpLayer.frame = frame;
    timpLayer.backgroundColor = backgroundColor.CGColor;
    timpLayer.anchorPoint = CGPointMake(0.5, 1);
    timpLayer.position = CGPointMake(COLOCKW, COLOCKH);
    [self.clockV.layer addSublayer:timpLayer];
    
    return timpLayer;
}

@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white camel

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值