ios-简易时钟

下面教大家用CALayer做时钟,不啰嗦了,上图上代码。

#import"ViewController.h"

#define perSec6

#define perMin6

#define perHour30

#define angleToRadious(angle) ((angle)/180.0* M_PI)

@interfaceViewController()

@property(nonatomic,strong)CALayer*secLay;

@property(nonatomic,strong)CALayer*minLay;

@property(nonatomic,strong)CALayer*HourLay;

@end

@implementationViewController

- (void)viewDidLoad {

[superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

UIImageView*img = [[UIImageViewalloc]initWithImage:[UIImageimageNamed:@"timg.jpeg"]];

img.frame=CGRectMake(0,0,200,200);

img.center=self.view.center;

[self.viewaddSubview:img];

//分针

self.minLay= [[CALayeralloc]init];

self.minLay.frame=CGRectMake(0,0,2,80);

//position这个坐标是相对父视图的

self.minLay.position=CGPointMake(img.bounds.size.width/2, img.bounds.size.height/2);

//anchorPoint:这个坐标是本View的中心坐标,anchorPoint跟position是永远重合的,所以想要anchorPoint和position相同,则需要把anchorPoint设置为(0,0),但该案例需求不同,因为我们希望把秒针设置到表盘的中心点,而此时的anchorPoint还是(0。5,0.5),这是默认的,如果需要设置成从表盘中心原点向外延伸的一条直线,则需要把anchorPoint设置为(0.5,1),0.5是为了让该线处于原点中心,而1呢,是为了让它与position重合。

self.minLay.anchorPoint=CGPointMake(0.5,1);

self.minLay.backgroundColor= [UIColorblackColor].CGColor;

[img.layeraddSublayer:self.minLay];

//时针

self.HourLay= [[CALayeralloc]init];

self.HourLay.frame=CGRectMake(0,0,2,60);

self.HourLay.position=CGPointMake(img.bounds.size.width/2, img.bounds.size.height/2);

self.HourLay.anchorPoint=CGPointMake(0.5,1);

self.HourLay.backgroundColor= [UIColorblackColor].CGColor;

[img.layeraddSublayer:self.HourLay];

//秒针

self.secLay= [[CALayeralloc]init];

self.secLay.frame=CGRectMake(0,0,1,80);

self.secLay.position=CGPointMake(img.bounds.size.width/2, img.bounds.size.height/2);

self.secLay.anchorPoint=CGPointMake(0.5,1);

self.secLay.backgroundColor= [UIColorredColor].CGColor;

[img.layeraddSublayer:self.secLay];

//数字Label

UILabel*timelb = [[UILabelalloc]init];

timelb.frame=CGRectMake(0,120,self.view.bounds.size.width,100);

timelb.font= [UIFontsystemFontOfSize:50];

timelb.textAlignment=NSTextAlignmentCenter;

[self.viewaddSubview:timelb];

__weakViewController*weakSelf =self;

[NSTimerscheduledTimerWithTimeInterval:1repeats:YESblock:^(NSTimer*_Nonnulltimer) {

//获取当前日历

NSCalendar*cal = [NSCalendarcurrentCalendar];

//根据需要获取对应的日历参数,比如时分秒:NSCalendarUnitHour、NSCalendarUnitMinute、NSCalendarUnitSecond

NSDateComponents*cmp = [calcomponents:NSCalendarUnitSecond|NSCalendarUnitMinute|NSCalendarUnitHourfromDate:[NSDatedate]];

NSIntegersec = cmp.second;

NSIntegermin = cmp.minute;

NSIntegerhour = cmp.hour;

//秒针一分钟走360度,每一秒是6度,根据当前秒数乘以度数,就是秒针在表盘上的旋转度数了,同理分针

CGFloatcurrSec = sec *perSec;

CGFloatcruuMin = min *perMin;

//时针比较特殊,它的幅度还有分针的幅度有关,那么需要知道一小时占六十分钟的百分比是多少?就是30/60 = 0.5度。举个例子:当时间在1小时45分的时候,如果用hour * perHour,那么得出的时针只是指到1点而已,而实际中,这个幅度是已经快两点了,那么是不符合要求的,所以需要知道分针当前的时间乘上0.5度再加上hour * perHour,这才是正确的刻度。

CGFloatcurrhour = hour *perHour+ min *0.5;

/*

*CATransform3DMakeRotation(<#CGFloat angle#>, <#CGFloat x#>, <#CGFloat y#>, <#CGFloat z#>)

*在这个API中,第一个参数表示旋转的度数,而在上面中,我们已经知道了时分秒该旋转多少度,但还不是真正的度数,需要进行转换

* #define angleToRadious(angle) ((angle)/180.0 * M_PI)通过这个宏,转换成度数

*后面的X,Y,Z的数值取值都是在[0,1]区间的,在这个案例中,因为我们的时分秒针都围绕Z轴旋转的,所以X,Y取零便可。

*/

weakSelf.secLay.transform=CATransform3DMakeRotation(angleToRadious(currSec),0,0,1);

weakSelf.minLay.transform=CATransform3DMakeRotation(angleToRadious(cruuMin),0,0,1);

weakSelf.HourLay.transform=CATransform3DMakeRotation(angleToRadious(currhour),0,0,1);

timelb.text= [NSStringstringWithFormat:@"%zd : %zd : %zd",hour,min,sec];

}];

}

@end


图一

效果如图一所示,直接新建View或者ViewController,代码原封不动搬过去就可以用了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,814评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,124评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,814评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,924评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,815评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,562评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,944评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,582评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,859评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,881评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,700评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,493评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,943评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,115评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,413评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,978评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,182评论 2 339

推荐阅读更多精彩内容

  • #import "ViewController.h" //每一秒旋转多少度 #define perSecA6 //...
    会写bug的程序媛阅读 1,565评论 4 1
  • Transform field value key paths! position.x position.y 1....
    youngZhou阅读 329评论 0 1
  • CALayer 概念 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文...
    iOS_Cqlee阅读 993评论 8 2
  • 动画只是Core Animation特性的冰山一角 Core Animation功能 Core Animation...
    封楼阅读 316评论 0 0
  • 晚上下班回来经常盯着手机屏幕发呆,就想写点什么,打发下漫长的夜晚,并记录下工作中的点点滴滴。 1.tablevie...
    so_what阅读 1,810评论 3 5