一、CALayer 中 名叫图层类,是整个Core Animation的基础,也是全部Core Animation图层类的 类。函数
二、CAAnimation CAAnimation是全部Core Animation中动画类的 类,遵照NSCoding、NSCopying、 CAMediaTiming和CAAction协议,负责实现各类动画效果,是Cocoa Touch动画的基础。学习
三、CAMediaTimingFunction 该类定义了 个动画的执 步调, 前Core Animation提供有 kCAMediaTimingFunctionLinear、kCAMediaTimingFunctionEaseIn、 kCAMediaTimingFunctionEaseOut、kCAMediaTimingFunctionEaseInEaseOut四种,固然咱们也 能够定制 想要的执 步调。动画
四、CATransaction CATransaction(事务)是Core Animation中 个将若干个对图层树的属性修改操做以原 式 更新到渲染树的机制。全部对图层树的修改都须要有事务,只不过有的是隐式的使 事务,有的是 显式的使 事务。事务 持嵌套使 。spa
1.内容简介 在咱们学习动画以前,先学习图层树,CALayer类在概念上和UIView相似,一样也是 些被层级关系 树管理的矩形块,一样也能够包含 些内容(像图 , 本或者背景 ),管理 图层的位置。它们有 些 法和属性 来作动画和变换。和UIView最 的不一样是CALayer不处理 户的交互。由于CALayer并不 清楚具体的响应链。实际上,这些背后关联的图层才是真正 来在屏幕上显 和作动画,UIView仅仅是对 CALayer的 个封装,而后提供了处理触摸的具体功能,以及CoreAnimation的 级接 。code
可是为何iOS要基于UIView和CALayer提供两个平 的层级关系呢?为何不 个简单的层级来 处理全部事情呢?缘由在于要作职责分离,这样也能避免不少重复代码。在iOS和Mac OS两个平台上,事 件和 户交互有不少地 的不一样,基于多点触控的 户界 和基于 标键盘有着本质的区别,这就是为什 么iOS有UIKit和UIView,可是Mac OS有AppKit和NSView的缘由。他们功能上很类似,可是在实现上有着 显著的区别。 前 已经讲过,UIView是对CALayer的封装,那为何咱们还要学习CALayer呢?由于UIView封装的 API在有些状况下并不能满 咱们的需求, 如: 1.阴影,圆 ,边框orm
2.3D变换图片
3.矩形范围事务
4.遮罩ci
5.线性动画get
2.视图的层级关系 3.图层的层级关系
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; // 一、bounds: 尺寸 layer.bounds = CGRectMake(0, 0, 200, 200); // 二、position: 定位点 layer.position = self.view.center; // 三、锚点、支点:决定layer上的哪一个点在 position 点上,默认(0.5, 0.5),范围:(0,0) ~ (1,1) layer.anchorPoint = CGPointMake(0.5, 0.5); // 四、z方向的层级 layer.zPosition = 2; // 五、设置圆角:cornerRadius layer.cornerRadius = 100;
4.CALayer填充设置
// 一、填充内容 layer.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"juhua"]].CGColor; // 二、是否能够裁剪多余的图层 // layer.masksToBounds = YES; // 三、设置边框宽度和颜色 layer.borderWidth = 5; layer.borderColor = [UIColor lightGrayColor].CGColor; // 四、设置阴影: 尺寸、颜色、透明度、圆角 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变换
// 一、经过函数设置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。