自制圆形时钟⏰

news2024/12/24 3:48:36

如果想着做一个类似的家里的圆形时钟的样式的钟表,可以使用这样的方法:

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,weak)CALayer *second;

@property (nonatomic ,weak)CALayer *minute;

@property (nonatomic ,weak)CALayer *hour;

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    self.view.backgroundColor = [UIColor cyanColor];

    //创建表盘

    CALayer *clock = [[CALayer alloc]init];

    //大小

    clock.bounds = CGRectMake(0, 0, 200, 200);

    //位置

    clock.position = CGPointMake(200, 200);

    //内容

    clock.contents = (__bridge id _Nullable)([UIImage imageNamed:@"clock"].CGImage);

    [self.view.layer addSublayer:clock];

    //圆角

    clock.cornerRadius = 100;

    //裁剪

    clock.masksToBounds = YES;

    

    //创建秒针

    CALayer *second = [[CALayer alloc]init];

    self.second = second;

    //大小

    second.bounds = CGRectMake(0, 0, 2, 100);

    //位置

    second.position = clock.position;

    //颜色

    second.backgroundColor = [UIColor redColor].CGColor;

    //锚点

    second.anchorPoint = CGPointMake(0.5, 0.8);

    [self.view.layer addSublayer:second];

    

    //创建分针

    CALayer *minute = [[CALayer alloc]init];

    self.minute = minute;

    //大小

    minute.bounds = CGRectMake(0, 0, 3, 80);

    //位置

    minute.position = clock.position;

    //颜色

    minute.backgroundColor = [UIColor blueColor].CGColor;

    //锚点

    minute.anchorPoint = CGPointMake(0.5, 0.8);

    [self.view.layer addSublayer:minute];

    

    //创建时针

    CALayer *hour = [[CALayer alloc]init];

    self.hour = hour;

    //大小

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

    //位置

    hour.position = clock.position;

    //颜色

    hour.backgroundColor = [UIColor purpleColor].CGColor;

    //锚点

    hour.anchorPoint = CGPointMake(0.5, 0.8);

    [self.view.layer addSublayer:hour];

    

    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(timeChange)];

    [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

    [self timeChange];

}

-(void)timeChange{

    NSDate *date = [NSDate date];

//

//    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];

//    formatter.dateFormat = @"ss";

//    NSString *ms = [formatter stringFromDate:date];

//    CGFloat msValue = [ms floatValue];

    NSCalendar *cal = [NSCalendar currentCalendar];

    CGFloat ms = [cal component:NSCalendarUnitNanosecond fromDate:date];

    CGFloat s= [cal component:NSCalendarUnitSecond fromDate:date];

    CGFloat m = [cal component:NSCalendarUnitMinute fromDate:date];

    CGFloat h = [cal component:NSCalendarUnitHour fromDate:date];

    

    //秒针角度

    CGFloat angle = (2 * M_PI/60) / 1000000000;

    CGFloat angle1 = 2 * M_PI / 60;

    self.second.affineTransform = CGAffineTransformMakeRotation(angle1 * s + angle * ms);

    //分针角度

    CGFloat minuteAngle = 2 * M_PI / 60;

    self.minute.affineTransform = CGAffineTransformMakeRotation(minuteAngle * m + angle1 * s / 60 + angle * ms / 60);

    //时针角度

    CGFloat hourAngle = 2 * M_PI / 12;

    self.hour.affineTransform = CGAffineTransformMakeRotation(hourAngle * h + minuteAngle * m / 12 + angle1 * s / 60 + angle * ms / 60);

    

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

@end

当然还要有一个这样的表盘,

其实代码实现主要是用的CALayer的一些动画效果实现的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1180174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内存卡读不出来怎么办?正确解决方法看这!

“不知道大家有没有遇到过内存卡读不出来的情况呀?我内存卡里还有很多重要的文件和材料,现在都无法读取,有什么方法可以帮我解决这个问题吗?” 内存卡的使用越来越频繁,可能很多用户会将比较重要的文件都保存在内存卡中…

【Python基础】 Python设计模式之单例模式介绍

单例模式 1.设计模式2.单例设计模式的应用场景3.new方法4. Python 中的单例 1.设计模式 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案使用 设计模式 是为了可重用代码、让代码更容易被他人理…

只需两步折叠GoLand的控制台中多余的信息,控制台显示无效内容太多(GOROOT、GOPATH)

一、问题:Goland控制台无效内容过多: GoLand的控制台显示无效内容太多(GOROOT、GOPATH),一键将折叠控制台多余的信息,如图所示: 二、解决方法: 第一步:Window系统是&am…

【网络编程】如何将UDP协议变得更可靠

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮&#xff0…

Verilog刷题[hdlbits] :Always case

题目:Always case Case statements in Verilog are nearly equivalent to a sequence of if-elseif-else that compares one expression to a list of others. Its syntax and functionality differs from the switch statement in C. Verilog中的Case语句几乎等同…

答题小程序排位pk答题怎么玩

答题小程序排位PK答题升级赛是一个备受喜爱的功能,它不仅增加了用户之间的互动和竞争,同时也为答题小程序增添了更多的趣味性和挑战性。那么,如何参与答题小程序的排位PK答题升级赛呢?本文将详细介绍答题小程序的排位PK答题升级赛…

网络安全与TikTok:年轻一代的数字素养

在数字时代,互联网成为我们生活的重要组成部分,而社交媒体平台则在年轻一代中变得日益流行。其中,TikTok作为一个短视频分享平台,吸引了全球数以亿计的用户,尤其年轻人。 然而,与其快速的普及相伴随的是网…

思维模型 首因效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。先入为主,一见钟情。 1 首因效应的应用 1.1 面试中的首因效应 小李是一名应届毕业生,他准备参加一家知名互联网公司的面试。在面试前,他做了充分的准备…

leetcode 215. 数组中的第K个最大元素

2023.11.7 本题两个思路,一个是先将数组排序,再从后往前数第k个元素即为第k个最大的元素。 或者使用优先队列,将数组元素放入队列中,当队列元素数量超过k时,弹出队列元素,由于优先队列的性质,每…

CodeWhisperer 的正确使用

1、重点: 重点1: 推出 Amazon Bedrock。这项新服务允许用户通过 API 访问来自 AI21 Labs、Anthropic、Stability AI 和亚马逊的基础模型。(Anthropic 就是之前跟 ChatGPT 掰手腕的 Claude 的模型。Stability AI 就是 Stable Diffusion 背后的…

外汇天眼:如何识破网络交友诈骗套路? 看到这7大特征请提高警觉

随着各种社群平台与交友APP不断推陈出新,现代人愈来愈习惯透过网路建立人际关系甚至谈恋爱。 但由于网络具有极高的匿名性,因此也成为诈骗温床,对社会造成相当严重的损失。 有鉴于此,外汇天眼根据一直以来收到针对黑平台的投诉与…

各省市30米分辨率DEM数据,推荐下载!

今天给大家推荐一个新数据 —— 各省市30米分辨率DEM数据! 各省市30米分辨率DEM数据广泛应用于国土资源调查、水利水电工程、地质灾害预警、城市规划等领域,对于了解区域内的地形地貌、地形分析、土地利用等具有非常重要的意义。 网站搜索“citybox城市…

数据时代的新引擎:数据治理与开发,揭秘数据领域的黄金机遇!

文章目录 一、数据时代的需求二、数据治理与开发三、案例分析四、黄金机遇《数据要素安全流通》《Python数据挖掘:入门、进阶与实用案例分析》《数据保护:工作负载的可恢复性 》《Data Mesh权威指南》《分布式统一大数据虚拟文件系统 Alluxio原理、技术与…

Microsoft 365 与Office 365 有什么区别?

从2020年起,部分Office 365 品牌的订阅计划整合到了Microsoft 365中,虽然这更符合微软对产品战略的定位,但却增加了用户分辨这两种产品的难度。 文章目录 Office 365包含哪些内容Microsoft 365包含哪些内容Microsoft 365包含哪些订阅Microso…

2023中国视频云市场报告:腾讯云音视频解决方案份额连续六次蝉联榜首,加速全球化布局

近日,国际数据公司(IDC)发布了《中国视频云市场跟踪(2023上半年)》报告,腾讯云音视频的解决方案份额连续六次蝉联榜首,并在视频生产创作与媒资管理市场份额中排名第一。同时,在实时音…

为什么深度学习模型的预测结果为数据集均值

如图,上边的为真值,下边的为预测值,可见预测值都是在30左右 一直debug不出来。后来发现是loss处写错了 用的torch.nn.MSELoss(pred,target),其中pred的size是(batchsize,1), target的size是(batchsize),此时会有警告但…

vue 集成高德地图,点击图标,弹出van-action-sheet,一闪而过的问题探究

代码 <van-action-sheet v-model"sheetShow" title""><div class"van-list-vol"><van-col span"3"><div><van-imagestyle"height: 40px; width: 40px"round:src"hospital.orgUrl? hospita…

玻色量子“揭秘”之最大割(Max-Cut)问题与QUBO建模

Max-Cut问题简单地说&#xff0c;就是求一种分割方法。给定一张无向图, 将所有顶点分割成两群, 同时使得被切断的边数量最大&#xff0c;或边的权重最大。 QUBO&#xff08;Quadratic Unconstrained Binary Optimization&#xff09;问题即二次无约束二值优化问题&#xff0c;…

Vue3 + Vite + Ts + Router搭建项目

1、新建文件夹 从新建的文件夹cmd进入终端 2、安装vite—依据vite创建vue3项目 2.1、运行 npm init vitelatest2.2.1、输入项目名称 2.2.2、选择vue 2.2.3、选择TypeScript语言 3、安装依赖项 3.1、进入刚才创建的文件夹 cd vite-project 3.2、查看镜像 #查看当前源 npm con…

Windows ObjectType Hook 之 SecurityProcedure

1、背景 Object Type Hook 是基于 Object Type的一种深入的 Hook&#xff0c;比起常用的 SSDT Hook 更为深入。 有关 Object Type 的分析见文章 《Windows驱动开发学习记录-ObjectType Hook之ObjectType结构相关分析》。 这里进行的 Hook 为 其中之一的 SecurityProcedure。文章…