时钟
2015-07-14 15:21
169 查看
#import "ViewController.h"
@interface
ViewController ()
{
UIImageView *_clockView;
CGFloat _clockWidth;
CGFloat _clockHeight;
CALayer *_secondLayer;
CALayer *_minuteLayer;
CALayer *_hourLayer;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//添加_clockView
[self
addBlockView];
//添加一个大圆点的layer
[self
addPointLayer];
//添加分针_minuteLayer
[self
addMinuteLayer];
//添加时针_hourLayer
[self
addHourLayer];
//添加秒针_secondLayer
[self
addSecondLayer];
//定时器
每个一秒调用一次update方法
[NSTimer
scheduledTimerWithTimeInterval:1
target:self
selector:@selector(update)
userInfo:nil
repeats:YES];
//作用:去除1秒延迟产生的bug
[self
update];
}
//添加表盘_clockView
- (void)addBlockView
{
UIImage *image = [UIImage
imageNamed:@"clock.png"];
_clockWidth = image.size.width;
_clockHeight = image.size.height;
_clockView = [[UIImageView
alloc]
initWithFrame:CGRectMake(0,
0, _clockWidth,
_clockHeight)];
[_clockView
setBackgroundColor:[UIColor
yellowColor]];
_clockView.center =
self.view.center;
[_clockView
setImage:image];
[self.view
addSubview:_clockView];
}
//添加一个大圆点的layer
- (void)addPointLayer
{
CALayer *pointLayer = [[CALayer
alloc] init];
pointLayer.bounds =
CGRectMake(0,
0, 10,
10);
pointLayer.position =
CGPointMake(_clockWidth/2,
_clockHeight/2);
pointLayer.cornerRadius =
5;
pointLayer.backgroundColor = [UIColor
blackColor].CGColor;
[_clockView.layer
addSublayer:pointLayer];
}
//添加秒针_secondLayer
- (void)addSecondLayer
{
//初始化秒针
_secondLayer = [[CALayer
alloc] init];
_secondLayer.bounds =
CGRectMake(0,
0, 2,
100);
_secondLayer.anchorPoint =
CGPointMake(0.5,
0.8);
_secondLayer.position =
CGPointMake(_clockWidth/2,
_clockHeight/2);
[_secondLayer
setBackgroundColor:[UIColor
redColor].CGColor];
[_clockView.layer
addSublayer:_secondLayer];
}
//添加分针_minuteLayer
- (void)addMinuteLayer
{
//初始化分针
_minuteLayer = [[CALayer
alloc] init];
_minuteLayer.bounds =
CGRectMake(0,
0, 4,
80);
_minuteLayer.cornerRadius =
2;
_minuteLayer.anchorPoint =
CGPointMake(0.5,
1);
_minuteLayer.position =
CGPointMake(_clockWidth/2,
_clockHeight/2);
[_minuteLayer
setBackgroundColor:[UIColor
blackColor].CGColor];
[_clockView.layer
addSublayer:_minuteLayer];
}
//添加时针_hourLayer
- (void)addHourLayer
{
//初始化时针
_hourLayer = [[CALayer
alloc] init];
_hourLayer.bounds =
CGRectMake(0,
0, 5,
60);
_hourLayer.cornerRadius =
2.5;
_hourLayer.anchorPoint =
CGPointMake(0.5,
1);
_hourLayer.position =
CGPointMake(_clockWidth/2,
_clockHeight/2);
[_hourLayer
setBackgroundColor:[UIColor
blackColor].CGColor];
[_clockView.layer
addSublayer:_hourLayer];
}
//更新
- (void)update
{
NSLog(@"-----update %@",[NSThread
currentThread]);
//每秒钟
秒针走的弧度
CGFloat perSecondAngle =
M_PI*2/60;
//每分钟
分针走的弧度
CGFloat perMinuteAngle =
M_PI*2/60;
//每秒钟
分针走的弧度
CGFloat perSecondMinuteAngle = perMinuteAngle/60;
//每小时
时针走的弧度
CGFloat perHourAngle =
M_PI*2/12;
//每分钟
时针走的弧度
CGFloat perMinuteHourAngle = perHourAngle/60;
//日历
NSCalendar *calendar = [NSCalendar
currentCalendar];
//获取日历组件
NSDateComponents *components = [calendar
components:NSCalendarUnitSecond|NSCalendarUnitMinute|NSCalendarUnitHour
fromDate:[NSDate
date]];
//获取当前的秒
CGFloat second = components.second;
//获取当前的分钟
CGFloat minute = components.minute;
//获取当前的小时
CGFloat hour = components.hour;
//当前时间
秒针走过的弧度
CGFloat secondAngle = second * perSecondAngle;
//当前时间
分针走过的弧度 = 当前分钟 *
每分钟分针走的弧度 + 当前秒 *
每秒钟分针走的弧度
CGFloat minuteAngle = minute * perMinuteAngle + second * perSecondMinuteAngle;
//当前时间
时针走过的弧度 = 当前小时 *
每小时时针走的弧度 + 当前分钟 *
每分钟时针走的弧度
CGFloat hourAngle = hour * perHourAngle + minute * perMinuteHourAngle;
//秒针旋转到
当前弧度
_secondLayer.transform =
CATransform3DMakeRotation(secondAngle,
0, 0, 1);
//分针旋转到
当前弧度
_minuteLayer.transform =
CATransform3DMakeRotation(minuteAngle,
0, 0, 1);
//时针旋转到
当前弧度
_hourLayer.transform =
CATransform3DMakeRotation(hourAngle,
0, 0, 1);
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
@interface
ViewController ()
{
UIImageView *_clockView;
CGFloat _clockWidth;
CGFloat _clockHeight;
CALayer *_secondLayer;
CALayer *_minuteLayer;
CALayer *_hourLayer;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//添加_clockView
[self
addBlockView];
//添加一个大圆点的layer
[self
addPointLayer];
//添加分针_minuteLayer
[self
addMinuteLayer];
//添加时针_hourLayer
[self
addHourLayer];
//添加秒针_secondLayer
[self
addSecondLayer];
//定时器
每个一秒调用一次update方法
[NSTimer
scheduledTimerWithTimeInterval:1
target:self
selector:@selector(update)
userInfo:nil
repeats:YES];
//作用:去除1秒延迟产生的bug
[self
update];
}
//添加表盘_clockView
- (void)addBlockView
{
UIImage *image = [UIImage
imageNamed:@"clock.png"];
_clockWidth = image.size.width;
_clockHeight = image.size.height;
_clockView = [[UIImageView
alloc]
initWithFrame:CGRectMake(0,
0, _clockWidth,
_clockHeight)];
[_clockView
setBackgroundColor:[UIColor
yellowColor]];
_clockView.center =
self.view.center;
[_clockView
setImage:image];
[self.view
addSubview:_clockView];
}
//添加一个大圆点的layer
- (void)addPointLayer
{
CALayer *pointLayer = [[CALayer
alloc] init];
pointLayer.bounds =
CGRectMake(0,
0, 10,
10);
pointLayer.position =
CGPointMake(_clockWidth/2,
_clockHeight/2);
pointLayer.cornerRadius =
5;
pointLayer.backgroundColor = [UIColor
blackColor].CGColor;
[_clockView.layer
addSublayer:pointLayer];
}
//添加秒针_secondLayer
- (void)addSecondLayer
{
//初始化秒针
_secondLayer = [[CALayer
alloc] init];
_secondLayer.bounds =
CGRectMake(0,
0, 2,
100);
_secondLayer.anchorPoint =
CGPointMake(0.5,
0.8);
_secondLayer.position =
CGPointMake(_clockWidth/2,
_clockHeight/2);
[_secondLayer
setBackgroundColor:[UIColor
redColor].CGColor];
[_clockView.layer
addSublayer:_secondLayer];
}
//添加分针_minuteLayer
- (void)addMinuteLayer
{
//初始化分针
_minuteLayer = [[CALayer
alloc] init];
_minuteLayer.bounds =
CGRectMake(0,
0, 4,
80);
_minuteLayer.cornerRadius =
2;
_minuteLayer.anchorPoint =
CGPointMake(0.5,
1);
_minuteLayer.position =
CGPointMake(_clockWidth/2,
_clockHeight/2);
[_minuteLayer
setBackgroundColor:[UIColor
blackColor].CGColor];
[_clockView.layer
addSublayer:_minuteLayer];
}
//添加时针_hourLayer
- (void)addHourLayer
{
//初始化时针
_hourLayer = [[CALayer
alloc] init];
_hourLayer.bounds =
CGRectMake(0,
0, 5,
60);
_hourLayer.cornerRadius =
2.5;
_hourLayer.anchorPoint =
CGPointMake(0.5,
1);
_hourLayer.position =
CGPointMake(_clockWidth/2,
_clockHeight/2);
[_hourLayer
setBackgroundColor:[UIColor
blackColor].CGColor];
[_clockView.layer
addSublayer:_hourLayer];
}
//更新
- (void)update
{
NSLog(@"-----update %@",[NSThread
currentThread]);
//每秒钟
秒针走的弧度
CGFloat perSecondAngle =
M_PI*2/60;
//每分钟
分针走的弧度
CGFloat perMinuteAngle =
M_PI*2/60;
//每秒钟
分针走的弧度
CGFloat perSecondMinuteAngle = perMinuteAngle/60;
//每小时
时针走的弧度
CGFloat perHourAngle =
M_PI*2/12;
//每分钟
时针走的弧度
CGFloat perMinuteHourAngle = perHourAngle/60;
//日历
NSCalendar *calendar = [NSCalendar
currentCalendar];
//获取日历组件
NSDateComponents *components = [calendar
components:NSCalendarUnitSecond|NSCalendarUnitMinute|NSCalendarUnitHour
fromDate:[NSDate
date]];
//获取当前的秒
CGFloat second = components.second;
//获取当前的分钟
CGFloat minute = components.minute;
//获取当前的小时
CGFloat hour = components.hour;
//当前时间
秒针走过的弧度
CGFloat secondAngle = second * perSecondAngle;
//当前时间
分针走过的弧度 = 当前分钟 *
每分钟分针走的弧度 + 当前秒 *
每秒钟分针走的弧度
CGFloat minuteAngle = minute * perMinuteAngle + second * perSecondMinuteAngle;
//当前时间
时针走过的弧度 = 当前小时 *
每小时时针走的弧度 + 当前分钟 *
每分钟时针走的弧度
CGFloat hourAngle = hour * perHourAngle + minute * perMinuteHourAngle;
//秒针旋转到
当前弧度
_secondLayer.transform =
CATransform3DMakeRotation(secondAngle,
0, 0, 1);
//分针旋转到
当前弧度
_minuteLayer.transform =
CATransform3DMakeRotation(minuteAngle,
0, 0, 1);
//时针旋转到
当前弧度
_hourLayer.transform =
CATransform3DMakeRotation(hourAngle,
0, 0, 1);
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
相关文章推荐
- netconsole简单配置
- RapidMiner Studio之Action源码分析
- RapidMiner Studio之GUI多语言支持
- RapidMiner Studio之Process源码分析
- C++智能指针及其简单实现
- Android中实现环状图的两种方式
- 杭电ACM 2070:Fibbonacci Number
- Microsoft Dynamics CRM 2013 自定义代码验证工具
- qt学习:Qt中Item Widget初步探索
- RapidMiner studio之GUI源码分析
- 锻炼身体
- ubuntu apt 代理设置
- 免费升级Win10又有新途径 金山毒霸直接升级win10
- GRE写作必备句型
- 黑马程序员------C语言的标识符的命名规则及其分类
- 使用Auto Layout-代码实现自动布局
- Oracle 表解锁语句
- 线程池总结
- libxml/tree.h file not found
- Codeforces Round #273 (Div. 2) C.Table Decorations 贪心