iOS 15:CALayer、核心动画

2016-04-08  本文已影响268人  d2cd99b0efce

CALayer

CALayer 到底是一个什么样的东西呢?每个UIView都有这样一层。UIView与CALayer就像是一阴一阳一样,与UIView相对,隐藏在控件之下。UIView暴露在阳光之下,可以与用户交互,CALayer在底层,有着图形渲染与核心动画的功能。

@property(nonatomic,readonly,retain) CALayer *layer; 
图片 1.png 图片 2.png
//宽度和高度
@property CGRect bounds;

//位置(默认指中点,具体由anchorPoint决定)
@property CGPoint position;

//锚点(x,y的范围都是0-1),决定了position的含义
@property CGPoint anchorPoint;

//背景颜色(CGColorRef类型)
@property CGColorRef backgroundColor;

//形变属性
@property CATransform3D transform;

//边框颜色(CGColorRef类型)
@property CGColorRef borderColor;

//边框宽度
@property CGFloat borderWidth;

//圆角半径
@property CGColorRef borderColor;

//内容(比如设置为图片CGImageRef)
@property(retain) id contents;
// 快速进行图层缩放,KVC
// x,y同时缩放0.5
[_redView.layer setValue:@0.5 forKeyPath:@"transform.scale"];
//旋转180°
_redView.layer setValue:@(M_PI) forKeyPath:@"transform.rotation"];
        
// 创建图层
    CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(50, 50, 200, 200);
    layer.backgroundColor = [UIColor redColor].CGColor;
    // 设置图层内容
    layer.contents = (id)[UIImage imageNamed:@"阿狸头像"].CGImage;
    [self.view.layer addSublayer:layer];

隐式动画

使用CALayer 主要是为了动画,但是开发时使用到动画的场合比较少,还不如CALayer本身使用次数频繁。
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.myview.layer.position = CGPointMake(10, 10);
[CATransaction commit];

项目:时钟

截图如下,最终实现这样的一个效果
Snip20160407_1.png
    // 获取当前日历对象
    NSCalendar *calendar = [NSCalendar currentCalendar];
    // 获取日期的组件:年月日小时分秒
    // components:需要获取的日期组件
    // fromDate:获取哪个日期的组件
    // 经验:以后枚举中有移位运算符,通常一般可以使用并运算(|)
    NSDateComponents  *cmp = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]];
    // 获取秒
    NSInteger second = cmp.second;

核心动画(简单了解)

Core Animation,中文翻译为核心动画,是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果,而且往往事半功倍。也就是说,使用少量的diamante就可以实现非常强大的功能。
Snip20160408_3.png
- (void)animationDidStart:(CAAnimation *)anim;
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

核心动画示例

// 计算裁减区域
CGRect clipR = CGRectMake(i * imageW, 0, imageW, imageH);
        
// 裁减图片
CGImageRef imgR =  CGImageCreateWithImageInRect(bigImage.CGImage, clipR);
UIImage *image = [UIImage imageWithCGImage:imgR];
// 渐变图层
CAGradientLayer *gradientL = [CAGradientLayer layer];
// 注意图层需要设置尺寸
gradientL.frame = _bottomView.bounds;
gradientL.opacity = 0;
// 设置渐变颜色
gradientL.colors = @[(id)[UIColor clearColor].CGColor,(id)[UIColor blackColor].CGColor];
_gradientL = gradientL;
// 设置控件主层的类型
+ (Class)layerClass
{
    return [CAReplicatorLayer class];
}
上一篇下一篇

猜你喜欢

热点阅读