当前位置: 移动技术网 > 移动技术>移动开发>IOS > iOS学习笔记-074.CALayer04——隐式动画

iOS学习笔记-074.CALayer04——隐式动画

2018年10月22日  | 移动技术网移动技术  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网