iOS学习笔记-074.CALayer04——隐式动画
程序员文章站
2022-04-15 10:49:21
calayer04——隐式动画
一、基本介绍
每一个uiview内部都默认关联着一个calayer,我们可用称这个layer为root layer(根层)
所有的非root...
calayer04——隐式动画
一、基本介绍
每一个uiview内部都默认关联着一个calayer,我们可用称这个layer为root layer(根层)
所有的非root layer,也就是手动创建的calayer对象,都存在着隐式动画
什么是隐式动画?
当对非root layer的部分属性进行修改时,默认会自动产生一些动画效果
而这些属性称为animatable properties(可动画属性)
列举几个常见的animatable properties: bounds:用于设置calayer的宽度和高度。修改这个属性会产生缩放动画 backgroundcolor:用于设置calayer的背景色。修改这个属性会产生背景色的渐变动画 position:用于设置calayer的位置。修改这个属性会产生平移动画
可以通过动画事务(catransaction)关闭默认的隐式动画效果
[catransaction begin]; [catransaction setdisableactions:yes]; //[catransaction setanimationduration:5]; self.myview.layer.position = cgpointmake(10, 10); [catransaction commit];
二、时钟案例
2.1 需要完成的效果图
2.2 代码
// // viewcontroller.m // 03_uiview67_时钟 // // created by 杞文明 on 17/6/11. // copyright ? 2017年 杞文明. all rights reserved. // #import "viewcontroller.h" //每一秒旋转的度数 #define perseca 6 //每一分旋转的度数 #define permina 6 //每一小时旋转的度数 #define perhoura 30 //每一分,时针旋转的度数 #define perminhour 0.5 #define angle2rad(angle) ((angle) / 180.0 * m_pi) @interface viewcontroller () @property (weak, nonatomic) iboutlet uiimageview *clockview; /** 当前的秒针 */ @property (nonatomic, weak) calayer *secl; /** 当前的分针 */ @property (nonatomic, weak) calayer *minl; /** 当前的针针 */ @property (nonatomic, weak) calayer *hourl; @end @implementation viewcontroller - (void)viewdidload { [super viewdidload]; [self inithourpointer]; [self initminpointer]; [self initsecpointer]; //创建定时器 [nstimer scheduledtimerwithtimeinterval:1 target:self selector:@selector(timechange) userinfo:nil repeats:yes]; [self timechange]; } //初始化时针 -(void)inithourpointer{ _hourl = [self createpointer:cgsizemake(4, 50) withcolor:[uicolor bluecolor]]; } //初始化分针 -(void)initminpointer{ _minl = [self createpointer:cgsizemake(3, 70) withcolor:[uicolor blackcolor]]; } //初始化秒针 -(void)initsecpointer{ _secl = [self createpointer:cgsizemake(1, 80) withcolor:[uicolor redcolor]]; } //创建指针 -(calayer*)createpointer:(cgsize)size withcolor: (uicolor*) backcolor{ calayer * pointer = [calayer layer]; pointer.bounds = cgrectmake(0, 0, size.width, size.height); pointer.backgroundcolor = backcolor.cgcolor; pointer.anchorpoint = cgpointmake(0.5, 0.9); pointer.position = cgpointmake(_clockview.bounds.size.width*0.5, _clockview.bounds.size.height*0.5); [_clockview.layer addsublayer:pointer]; return pointer; } //时间改变 -(void)timechange{ //获取时间 nscalendar *cal = [nscalendar currentcalendar]; nsdatecomponents *cmp = [cal components:(nscalendarunithour|nscalendarunitminute|nscalendarunitsecond) fromdate:[nsdate date]]; nsinteger cursec = cmp.second; nsinteger curmin = cmp.minute; nsinteger curhour = cmp.hour; nslog(@" %ld : %ld : %ld",curhour,curmin,cursec); //计算秒针的位置 cgfloat seca = cursec * perseca; _secl.transform = catransform3dmakerotation(angle2rad(seca), 0, 0, 1); //计算分钟位置 cgfloat mina = curmin * permina; _minl.transform = catransform3dmakerotation(angle2rad(mina), 0, 0, 1); //计算时钟位置 cgfloat houra = curhour * perhoura + curmin * perminhour; _hourl.transform = catransform3dmakerotation(angle2rad(houra), 0, 0, 1); } @end
下一篇: iOS 控制任务执行顺序