iOS开发核心动画之时钟效果
1. 创建秒针,因秒针与用户无交换,可以用layer
1> 创建秒针
// 创建秒针CALayer *secondLayer = [CALayer layer];self.secondLayer = secondLayer;
2> 设置背景色/尺寸/位置
设置锚点(0.5, 0.9)
// 设置背景色secondLayer.backgroundColor = [UIColor redColor].CGColor;// 设置尺寸和位置CGFloat clockViewH = self.clockView.bounds.size.height;secondLayer.frame = CGRectMake(0, 0, 1, clockViewH * 0.5 - 10);secondLayer.position = CGPointMake(clockViewH * 0.5, clockViewH * 0.5);secondLayer.anchorPoint = CGPointMake(0.5, 0.9);
3> 将秒针layer添加到钟表图层上
[self.clockView.layer addSublayer:secondLayer];
4> 开启定时器,每隔1s调用timeChanged方法.来旋转秒针
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeChanged) userInfo:nil repeats:YES];
[selftimeChanged];
2. 秒针旋转(实现监听方法 - (void)timeChanged)
1> 获取当前日历
NSCalendar *calendar = [NSCalendar currentCalendar];
2> 获取当前日历的秒数/分钟数/小时数
NSDateComponents *cmp = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];
3> 获取秒数, 秒针转一圈60秒转360度, 每秒转6度, 计算当前秒数转多少弧度
1度 = 1 / 180.0 * M_PI 弧度
// 计算弧度CGFloat secondA = second * 6 * (M_PI / 180);// 旋转self.secondLayer.transform = CATransform3DMakeRotation(secondA, 0, 0, 1);
3. 同样创建分钟/时针
分钟
- (void)setUpMin{// 创建分针CALayer *minLayer = [CALayer layer];self.minLayer = minLayer;// 设置背景色minLayer.backgroundColor = [UIColor blackColor].CGColor;// 设置尺寸和位置CGFloat clockViewH = self.clockView.bounds.size.height;minLayer.frame = CGRectMake(0, 0, 4, clockViewH * 0.5 - 20);minLayer.position = CGPointMake(clockViewH * 0.5, clockViewH * 0.5);minLayer.anchorPoint = CGPointMake(0.5, 1);[self.clockView.layer addSublayer:minLayer];}
时针
- (void)setUpHour{// 创建时针CALayer *hourLayer = [CALayer layer];self.hourLayer = hourLayer;// 设置背景色hourLayer.backgroundColor = [UIColor blackColor].CGColor;// 设置尺寸和位置CGFloat clockViewH = self.clockView.bounds.size.height;hourLayer.frame = CGRectMake(0, 0, 4, clockViewH * 0.5 - 30);hourLayer.position = CGPointMake(clockViewH * 0.5, clockViewH * 0.5);hourLayer.anchorPoint = CGPointMake(0.5, 1);[self.clockView.layer addSublayer:hourLayer];}
4. 在监听方法 - (void)timeChanged 中对分钟/时针进行旋转
分钟 : 分钟转一圈60分钟转360度,每分转6度.旋转角度和秒针一样
// 获取分钟NSInteger min = cmp.minute;CGFloat minA = min * 6 * (M_PI / 180);self.minLayer.transform = CATransform3DMakeRotation(minA, 0, 0, 1);
时针 : 时针转一圈12小时转360度,每小时转30度, 分钟走时针相应也会走,因此将分钟走的时间不足1小时转换成小时,最终时针旋转角度
// 获取时针NSInteger hour = cmp.hour;CGFloat hourA = (hour + min / 60) * 30 * (M_PI / 180);self.hourLayer.transform = CATransform3DMakeRotation(hourA, 0, 0, 1);

浙公网安备 33010602011771号