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。
来源:oschina
链接:https://my.oschina.net/u/2892214/blog/738739