用代码实现时钟功能

本文档通过Objective-C代码展示了如何实现一个时钟功能,包括秒针、分针和时针的旋转动画。通过计算每秒、每分钟和每小时对应的旋转角度,利用Core Animation的图层变换进行实时更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


// 每一秒旋转的角度

#define perSec  6


// 每一分钟旋转的角度

#define perMin 6


// 每一个小时旋转的角度

#define perHour 30

// 每一分钟所对应时针旋转的角度

#define perMin2hourAngle 0.5


#import "ViewController.h"


@interface ViewController ()


@property (weak, nonatomic) IBOutlet UIImageView *myView;

@property(nonatomic, strong)CALayer *secLayer;

@property(nonatomic, strong)CALayer *hourLayer;

@property(nonatomic, strong)CALayer *minLayer;


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    [self setUpSec];

    [self setUpMin];

    [self setUpHour];

    

// 创建一个定时器

    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];

    

    [self timeChange];

}


- (void)timeChange

{

//    获取当前日历

    NSCalendar *calendar = [NSCalendar currentCalendar];

//    获取当前日期单元

    NSDateComponents *cmp = [calendar components:NSCalendarUnitHour| NSCalendarUnitSecond|NSCalendarUnitMinute fromDate:[NSDate date]];

//    获取当前日期中的当前秒数

    NSInteger sec = cmp.second;

//    获取当前日期中的分钟数

    NSInteger min = cmp.minute;

//    获取当前日期中的小时数

    NSInteger hour = cmp.hour;

//    计算秒针走过的弧度

CGFloat secAngle = perSec * sec /180.0 *M_PI;

//    计算分针走过的弧度

CGFloat minAngle = perMin * min /180.0 *M_PI;

//    计算时针走过的弧度

CGFloat hourAngle = (perHour * hour+ perMin2hourAngle * min) /180.0 *M_PI ;

    

    self.secLayer.transform = CATransform3DMakeRotation(secAngle, 0, 0, 1);

    self.minLayer.transform = CATransform3DMakeRotation(minAngle, 0, 0, 1);

    self.hourLayer.transform = CATransform3DMakeRotation(hourAngle, 0, 0, 1);


    

}


- (void)setUpSec

{

    //    创建一个非根图层(秒针)

    CALayer *seclayer = [CALayer layer];

    self.secLayer = seclayer;

    

    seclayer.backgroundColor = [UIColor redColor].CGColor;

    seclayer.bounds = CGRectMake(0, 0, 2, 80);

    seclayer.anchorPoint = CGPointMake(0.5, 1);

    seclayer.position = CGPointMake(self.myView.bounds.size.width *0.5, self.myView.bounds.size.height *0.5);

    //    把图层添加到根图层中

    [self.myView.layer addSublayer:seclayer];

 

}


- (void)setUpMin

{

    //    创建一个非根图层(秒针)

    CALayer *minlayer = [CALayer layer];

    self.minLayer = minlayer;

    

    minlayer.backgroundColor = [UIColor blackColor].CGColor;

    minlayer.bounds = CGRectMake(0, 0, 3, 70);

    minlayer.anchorPoint = CGPointMake(0.5, 1);

    minlayer.position = CGPointMake(self.myView.bounds.size.width *0.5, self.myView.bounds.size.height *0.5);

    //    设置时针的圆角半径

    minlayer.cornerRadius = 1;

    //    把图层添加到根图层中

    [self.myView.layer addSublayer:minlayer];


}

- (void)setUpHour

{

    //    创建一个非根图层(秒针)

    CALayer *hourlayer = [CALayer layer];

    self.hourLayer = hourlayer;

    

    hourlayer.backgroundColor = [UIColor blackColor].CGColor;

    hourlayer.bounds = CGRectMake(0, 0, 4, 60);

    hourlayer.anchorPoint = CGPointMake(0.5, 1);

    hourlayer.position = CGPointMake(self.myView.bounds.size.width *0.5, self.myView.bounds.size.height *0.5);

    //    设置时针的圆角半径

    hourlayer.cornerRadius = 2;

    

    //    把图层添加到根图层中

    [self.myView.layer addSublayer:hourlayer];


}

@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值