IOS-Core Animation

拜拜、爱过 提交于 2019-12-01 17:49:42

1.Core Animation 类结构

1、CALayer 中 名叫图层类,是整个Core Animation的基础,也是所有Core Animation图层类的 类。

2、CAAnimation CAAnimation是所有Core Animation中动画类的 类,遵守NSCoding、NSCopying、 CAMediaTiming和CAAction协议,负责实现各种动画效果,是Cocoa Touch动画的基础。

3、CAMediaTimingFunction 该类定义了 个动画的执 步调, 前Core Animation提供有 kCAMediaTimingFunctionLinear、kCAMediaTimingFunctionEaseIn、 kCAMediaTimingFunctionEaseOut、kCAMediaTimingFunctionEaseInEaseOut四种,当然我们也 可以定制 想要的执 步调。

4、CATransaction CATransaction(事务)是Core Animation中 个将若干个对图层树的属性修改操作以原 式 更新到渲染树的机制。所有对图层树的修改都需要有事务,只不过有的是隐式的使 事务,有的是 显式的使 事务。事务 持嵌套使 。

2.CALayer基础

1.内容简介 在我们学习动画之前,先学习图层树,CALayer类在概念上和UIView类似,同样也是 些被层级关系 树管理的矩形块,同样也可以包含 些内容(像图 , 本或者背景 ),管理 图层的位置。它们有 些 法和属性 来做动画和变换。和UIView最 的不同是CALayer不处理 户的交互。因为CALayer并不 清楚具体的响应链。实际上,这些背后关联的图层才是真正 来在屏幕上显 和做动画,UIView仅仅是对 CALayer的 个封装,然后提供了处理触摸的具体功能,以及CoreAnimation的 级接 。

但是为什么iOS要基于UIView和CALayer提供两个平 的层级关系呢?为什么不 个简单的层级来 处理所有事情呢?原因在于要做职责分离,这样也能避免很多重复代码。在iOS和Mac OS两个平台上,事 件和 户交互有很多地 的不同,基于多点触控的 户界 和基于 标键盘有着本质的区别,这就是为什 么iOS有UIKit和UIView,但是Mac OS有AppKit和NSView的原因。他们功能上很相似,但是在实现上有着 显著的区别。 前 已经讲过,UIView是对CALayer的封装,那为什么我们还要学习CALayer呢?因为UIView封装的 API在有些情况下并不能满 我们的需求, 如: 1.阴影,圆 ,边框

2.3D变换

3.矩形范围

4.遮罩

5.线性动画

2.视图的层级关系 输入图片说明3.图层的层级关系 输入图片说明

3.CALayer的使用

1.创建CALayer

 // 创建layer
    CALayer *layer = [[CALayer alloc] init];
    layer.frame = CGRectMake(10, 320, 330, 200);
    layer.backgroundColor = [UIColor blueColor].CGColor; 
    // 将图层添加到父图层
    [self.view.layer addSublayer:layer];

2.对CALayer进行填充

    // 填充图片内容,需要将 UIImage 桥接(__bridge)到CGImage
    layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"image4.jpg"].CGImage);
    // 使用layer CATextLayer 子类填充文字
    CATextLayer *textLayer = [[CATextLayer alloc] init];
    textLayer.frame = CGRectMake(10, 550, 300, 30);
    textLayer.string = @"这是layer填充的文字内容";
    textLayer.foregroundColor = [UIColor blackColor].CGColor;
    textLayer.backgroundColor = [UIColor redColor].CGColor;
    textLayer.font = (__bridge CFTypeRef _Nullable)([UIFont systemFontOfSize:20 weight:500]);
    textLayer.fontSize = 20;
    textLayer.alignmentMode = @"center";
    // textLayer.truncationMode = @"middle";
    [self.view.layer addSublayer:textLayer];

3.CALayer的基本设置

CALayer *layer = [CALayer layer];
    // layer.frame = CGRectMake(0, 100, 350, 200);
    layer.backgroundColor = [UIColor orangeColor].CGColor;
    // 1、bounds: 尺寸
    layer.bounds = CGRectMake(0, 0, 200, 200);
    // 2、position: 定位点
    layer.position = self.view.center;
    // 3、锚点、支点:决定layer上的哪个点在 position 点上,默认(0.5, 0.5),范围:(0,0) ~ (1,1)
    layer.anchorPoint = CGPointMake(0.5, 0.5);
    // 4、z方向的层级
    layer.zPosition = 2;
    // 5、设置圆角:cornerRadius
    layer.cornerRadius = 100;
    

4.CALayer填充设置

// 1、填充内容
    layer.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"juhua"]].CGColor;
    // 2、是否可以裁剪多余的图层
    // layer.masksToBounds = YES;
    // 3、设置边框宽度和颜色
    layer.borderWidth = 5;
    layer.borderColor = [UIColor lightGrayColor].CGColor;
    
    // 4、设置阴影: 尺寸、颜色、透明度、圆角
    layer.shadowOffset = CGSizeMake(10, 5);
    layer.shadowColor = [UIColor redColor].CGColor;
    layer.shadowOpacity = 0.5;
    layer.shadowRadius = 10;

5.动画设置

 // 隐式动画: 当layer的属性发生变换时会默认产生动画效果,动画时间0.25s
   layer.opacity = 0.2;
   layer.cornerRadius = 50;
   
   // 组合 CATransform3D
   CATransform3D transform_01 = CATransform3DScale(layer.transform, 2, 2, 1);
   CATransform3D transform_02 = CATransform3DRotate(layer.transform, M_PI_4, 0, 0, 1);
   layer.transform = CATransform3DConcat(transform_01, transform_02);
   
   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
       
       layer.opacity = 1;
       layer.cornerRadius = 0;
       layer.transform = CATransform3DIdentity;

6.3D变换

 // 1、通过函数设置transform
    layer.transform = CATransform3DTranslate(layer.transform, 0, 0, 100);
    
    layer.transform = CATransform3DScale(layer.transform, 1, 1, 1.5);
    
    layer.transform = CATransform3DRotate(layer.transform, M_PI_4, 0, 0, 1);

当然,在设置CALayer的transform时你也可以使用其他不同的方法来设置,比如你可以通过 KVC 设置transform。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!