欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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 需要完成的效果图

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

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