时钟

#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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值