iOS篇—Demo5—时钟

Demo5—时钟

1.使用图层设置背景图片

self.view.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"time"].CGImage);

2.创建一个图层用来显示时钟图片,并设置相应的属性

//创建一个图层用来显示一张图片
CALayer *wheelLayer = [CALayer layer];

//设置显示的位置position
wheelLayer.position = CGPointMake(180, 250);

//设置图层的宽 高 bounds属性
wheelLayer.bounds = CGRectMake(0, 0, 296, 296);

//设置锚点:图层的哪个位置和position重合
wheelLayer.anchorPoint = CGPointMake(0.5, 0.5);

//设置图层的内容 即图片
wheelLayer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"Clock"].CGImage);

//图层没法接收事件 要添加图层必须依赖某个视图 所以需要将图层添加到某个视图上图层上
[self.view.layer addSublayer:wheelLayer];

3.创建一个点图层

//创建一个圆点图层
CALayer *redPointLayer = [CALayer layer];

//让红点和表环的中心点重合
redPointLayer.position = wheelLayer.position;

//设置圆点的尺寸
redPointLayer.bounds = CGRectMake(0, 0, 15, 15);

//设置圆角半径
redPointLayer.cornerRadius = 7.5;

//设置圆点颜色
redPointLayer.backgroundColor = [UIColor redColor].CGColor;

4.创建指针,并设置相应属性

  • 创建时针
//创建时针
self.hourLayer = [CALayer layer];
//位置
_hourLayer.position = wheelLayer.position;
//设置锚点
_hourLayer.anchorPoint = CGPointMake(0.5, 0.7);
//尺寸
_hourLayer.bounds = CGRectMake(0, 0, 8, 80);
//颜色
_hourLayer.backgroundColor = [UIColor blackColor].CGColor;
//显示
[self.view.layer addSublayer:_hourLayer];
  • 创建分针
//创建分针
self.miniuteLayer = [CALayer layer];
//位置
_miniuteLayer.position = wheelLayer.position;
//设置锚点
_miniuteLayer.anchorPoint = CGPointMake(0.5, 0.7);
//尺寸
_miniuteLayer.bounds = CGRectMake(0, 0, 6, 100);
//颜色
_miniuteLayer.backgroundColor = [UIColor redColor].CGColor;
//显示
[self.view.layer addSublayer:_miniuteLayer];
  • 创建秒针
//创建秒针
self.secondLayer = [CALayer layer];
//位置
_secondLayer.position = wheelLayer.position;
//设置锚点
_secondLayer.anchorPoint = CGPointMake(0.5, 0.7);
//尺寸
_secondLayer.bounds = CGRectMake(0, 0, 4, 120);
//颜色
_secondLayer.backgroundColor = [UIColor greenColor].CGColor;
//显示
[self.view.layer addSublayer:_secondLayer];

5.写一个方法,让指针对应当前的具体时间

- (void)changeTime{
    //1.获取当前的时间,时间的类:NSDate,二进制:NSData
    NSDate *nowTime = [NSDate date];
    //提取时间,NSDateFormatter类:管理读取时间的格式
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    //设置提取的格式
    formatter.dateFormat = @"K:m:s";
    //从当前时间中提取时分秒
    NSString *timeStr = [formatter stringFromDate:nowTime];
    NSLog(@"%@", timeStr);
    //将字符串分割
    NSArray *timeArray = [timeStr componentsSeparatedByString:@":"];
    NSLog(@"%@", timeArray);
    //将数组中的字符串转换成整型
    int hour = [[timeArray objectAtIndex:0] intValue];
    int minute = [[timeArray objectAtIndex:1] intValue];
    int second = [[timeArray objectAtIndex:2] intValue];
    NSLog(@"%d %d %d", hour, minute, second);
    
    //旋转时分秒针
    _hourLayer.transform = CATransform3DRotate(self.hourLayer.transform, M_PI/6*(hour+minute/60), 0, 0, 1);
    _miniuteLayer.transform = CATransform3DRotate(self.miniuteLayer.transform, M_PI/30*(minute+second/60), 0, 0, 1);
    _secondLayer.transform = CATransform3DRotate(self.secondLayer.transform, M_PI/30.0*second, 0, 0, 1);
}

6.开启一个定时器,使程序运行起来,时钟开始走

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    //开启定时器,让时钟走起来
    //1.CADisplayLink - 对UIView进行动画 无法完成只运行某个时间段的设置
    //2.NSTime - 数据的处理 如果视图中有滚动视图 在执行滚动事件的时候定时器无效了
    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(rotate)];
    //默认情况下通过屏幕刷新pinlv来执行任务 60HZ:1s刷新屏幕60次
    link.preferredFramesPerSecond = 1;
    //必须将这个对象放到NSRunLoop中才能被执行
    [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}

7.写一个方法,实现让时分秒指针转起来的操作

- (void)rotate{
    _secondLayer.transform = CATransform3DRotate(_secondLayer.transform, M_PI*2/60.0, 0, 0, 1);
    _miniuteLayer.transform = CATransform3DRotate(_miniuteLayer.transform, M_PI*2/60.0/60.0, 0, 0, 1);
    _hourLayer.transform = CATransform3DRotate(_hourLayer.transform, M_PI*2/60.0/60.0/12.0, 0, 0, 1);
}

8.添加"嘀嗒"的钟表声

  • 先导入头文件
#import <AudioToolbox/AudioToolbox.h>
  • 实现方法
- (void)playMusic{
    //1.获取音频文件路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"dida.m4a" ofType:nil];
    
    //2.将字符串的路径转化为NSURL类型
    NSURL *url = [NSURL fileURLWithPath:filePath];
    
    //3.为这个url对应的音频,创建一个系统ID
    SystemSoundID soundID;
    AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &soundID);
    
    //4.播放音频
    AudioServicesPlaySystemSound(soundID);
}

猜你喜欢

转载自blog.csdn.net/weixin_43733988/article/details/88580599
今日推荐