
需要理解CALayer的anchorPoint属性的意义,可参考CALayer 的 position和anchorPoint属性或其他资料。
以秒针为例:
- 计算每秒的弧度
- 获取当前为多少秒,即可得到当前秒针应该为多少弧度
- 绘制CGAffineTransformMakeRotation()
由于显示器刷新频率的问题,有可能感觉秒针走动与系统时钟的秒针走动不一致。因此,当显示器刷新时就刷新一次UI
//与显示器刷新频率相关联的类 每次显示器刷新都会执行这个方法
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(tick)];
//加到主消息循环中
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
代码:
//计算每秒的弧度
CGFloat radian = M_PI * 2 / 60;
//获取当前系统的时分秒
NSDate *date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
// //获取秒
// NSInteger second = [calendar component:NSCalendarUnitSecond fromDate:date];
NSDateComponents *comp = [calendar components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:date];
NSInteger hour = comp.hour;
NSInteger minute = comp.minute;
NSInteger second = comp.second;
//计算本次秒针应该旋转的弧度
radian = radian * second;
//让当前秒针与原来的弧度增加一个radian
self.secondView.transform = CGAffineTransformMakeRotation(radian);
/*******************************************************************/
//计算每小时弧度
CGFloat hourRadian = (M_PI * 2) / 12.0;
//本次时针应该旋转的弧度
hourRadian = hourRadian * hour;
self.hourView.transform = CGAffineTransformMakeRotation(hourRadian);
/*******************************************************************/
//计算每分钟弧度
CGFloat minuteRadian = M_PI * 2 / 60;
//计算本次分针应该旋转的弧度
minuteRadian = minuteRadian * minute;
self.minuteView.transform = CGAffineTransformMakeRotation(minuteRadian);
网友评论