获取日历对象,制作时钟


// 每秒秒针转6度
#define perSecendA 6

// 每分钟分针转6度
#define perMinuteA 6

// 每小时时针转6度
#define perHourA 30

// 每分钟时针转6度
#define perMinuteHourA 0.5

#define angle2radian(x) ((x) / 180.0 * M_PI)

@interface HMViewController ()
{
    CALayer *_second;
    CALayer *_minute;
    CALayer *_hour;
}
@property (weak, nonatomic) IBOutlet UIView *redView;
@property (weak, nonatomic) IBOutlet UIImageView *clockView;

@end

@implementation HMViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 1.添加秒针
    [self addSecond];
    
    // 2.添加分针
    [self addMintue];
    
    // 3.添加时针
    [self addHour];
   
    
    // 创建定时器
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(update) userInfo:nil repeats:YES];
    
    
    [self update];
}

- (void)addHour
{
    CGFloat imageW = _clockView.bounds.size.width;
    CGFloat imageH = _clockView.bounds.size.height;
    
    // 1.添加时针
    CALayer *hour = [CALayer layer];
    
    // 2.设置锚点
    hour.anchorPoint = CGPointMake(0.5, 1);
    
    // 3.设置位置
    hour.position = CGPointMake(imageW * 0.5, imageH * 0.5);
    
    // 4.设置尺寸
    hour.bounds = CGRectMake(0, 0, 4, imageH * 0.5 - 50);
    
    // 5.红色
    hour.backgroundColor = [UIColor blackColor].CGColor;
    
    hour.cornerRadius = 4;
    
    // 添加到图层上
    [_clockView.layer addSublayer:hour];
    
    _hour = hour;
}

// 添加分针
- (void)addMintue
{
    CGFloat imageW = _clockView.bounds.size.width;
    CGFloat imageH = _clockView.bounds.size.height;
    
    // 1.添加分针
    CALayer *minute = [CALayer layer];
    
    // 2.设置锚点
    minute.anchorPoint = CGPointMake(0.5, 1);
    
    // 3.设置位置
    minute.position = CGPointMake(imageW * 0.5, imageH * 0.5);
    
    // 4.设置尺寸
    minute.bounds = CGRectMake(0, 0, 2, imageH * 0.5 - 30);
    
    // 5.红色
    minute.backgroundColor = [UIColor blueColor].CGColor;
    
    // 添加到图层上
    [_clockView.layer addSublayer:minute];
    
    _minute = minute;
}

// 添加秒针
- (void)addSecond
{
    CGFloat imageW = _clockView.bounds.size.width;
    CGFloat imageH = _clockView.bounds.size.height;
    
    // 1.添加秒针
    CALayer *second = [CALayer layer];
    
    // 2.设置锚点
    second.anchorPoint = CGPointMake(0.5, 1);
    
    // 3.设置位置
    second.position = CGPointMake(imageW * 0.5, imageH * 0.5);
    
    // 4.设置尺寸
    second.bounds = CGRectMake(0, 0, 1, imageH * 0.5 - 20);
    
    // 5.红色
    second.backgroundColor = [UIColor redColor].CGColor;
    
    // 添加到图层上
    [_clockView.layer addSublayer:second];
    
    _second = second;
}

- (void)update
{
    // 获取秒数
    // 获取日历对象
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSLog(@"calendar = %@", calendar);
    // 获取日期组件
    NSDateComponents *compoents = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];
    NSLog(@"compoents = %@", compoents);
    // 获取秒数
    CGFloat sec = compoents.second;
    
    // 获取分钟
    CGFloat minute = compoents.minute;
    
    // 获取小时
    CGFloat hour = compoents.hour;

    
    // 算出秒针旋转多少°
    CGFloat secondA = sec * perSecendA;
    
    // 算出分针旋转多少°
    CGFloat minuteA = minute * perMinuteA;
    
    // 算出时针旋转多少°
    CGFloat hourA = hour * perHourA;
    hourA += minute * perMinuteHourA;
    NSLog(@"sec = %.2f  minute = %.2f hour = %.2f", sec, minute, hour);
    // 旋转秒针
    _second.transform = CATransform3DMakeRotation(angle2radian(secondA), 0, 0, 1);
    
    // 旋转分针
    _minute.transform = CATransform3DMakeRotation(angle2radian(minuteA), 0, 0, 1);
    
    // 旋转时针
    _hour.transform = CATransform3DMakeRotation(angle2radian(hourA), 0, 0, 1);

}
// 隐式动画
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{

    UITouch *touch = [touches anyObject];

    CGPoint pos = [touch locationInView:self.view];

    _clockView.layer.position = pos;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值