iOS核心动画(专用图层篇)
之前的文章我们了解了Core Animation中图层的一些基础知识。没有看过的传送门在此:
iOS核心动画基础篇
那么在了解了这些基础知识之后,接下来进入专用图层的了解
苹果为了方便和性能,封装了几种专用图层,各有特性。
CAShapeLayer
那么什么时候用CAShapeLayer呢?
当我们想要一个任意形状的layer。就可以使用CAShapeLayer
虽然你可以用Core Graphics绘制图形,但是使用CAShapeLayer是存在如下优势的:
- 渲染快速。CAShapeLayer使用了硬件加速
- 高效使用内存。CAShapeLayer不需要创建寄宿图形就可以显示
- 不会被图层边界裁剪
- 不会出现像素化。因为它是通过矢量图形绘制的
那么怎么用CAShapeLayer呢?
通过指定一个CGPath来定义想要绘制的图形,CAShapeLayer就可以自动渲染。
通过属性控制lineWith
(线宽,用点表示单位),lineCap
(线条结尾的样子),和lineJoin
(线条之间的结合点的样子);
通过属性控制 fillColor(填充颜色),strokeColor(线条颜色)
通常我们创建UIBezierPath
的类来转化成CGpath
做为CAShaperLayer
的path
,就可以使用ARC了。
举个栗子更容易理解,下面代码生成了一个有三个圆角一个直角的矩形
CGRect rect = CGRectMake(50, 50, 100, 100);
CGSize radii = CGSizeMake(20, 20);
UIRectCorner corners = UIRectCornerTopRight | UIRectCornerBottomRight | UIRectCornerBottomLeft;
//create path
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:radii];
CAShapeLayer *slayer = [CAShapeLayer layer];
slayer.path = path.CGPath;
slayer.fillColor = [UIColor clearColor].CGColor;
slayer.strokeColor = [UIColor greenColor].CGColor;
CATextLayer
CATextLayer的优点是什么?
以图层的形式包含了UILabel几乎所有的绘制特性,并且额外提供了一些新的特性。
CATextLayer
要比UILabel
渲染的快的多。因为CATextLayer
使用的是Core Text
。
如果直接使用CATextLayer
实现文字的话,layer
的contentScale
是默认的1.所以如果要Retina
屏幕的显示效果的话,我们就需要下面的代码
textLayer.contentsScale = [UIScreen mainScreen].scale;
那么怎么用CATextLayer呢?
CATextLayer的font和string属性都是id类型。你可以选择任意框架的数据传入。比如CF开头,或者CT开头。string属性,你可以传入的是NSSTtring类型,也可以是NSAttributedString
CFStringRef fontName = (__bridge CFStringRef)font.fontName;
CGFontRef fontRef = CGFontCreateWithFontName(fontName);
textLayer.font = fontRef;
textLayer.fontSize = font.pointSize;
CGFontRelease(fontRef);
NSString *text = @"Lorem ipsum dolor sit amet";
//set layer text
textLayer.string = text;
我们已经证实了CATextLayer
要比UILabel
的性能更高。如果我们需要一个UILabel
的替代品,最好能像一般的视图一样工作。
接下来我们把
CATextLayer
进行封装
我们应该创建一个UILabel
的子类,如果只是在这个子类中创建CATextLayer
子图层并重写显示文本的方法,但是还是会有drawRect:
方法创建的空的寄宿图层。而且子图层因为不支持自动缩放和自动布局,不能自动适应视图的大小。
我们可以通过改写UIView的+layerClass
方法返回自己想要的图层类型。UIView
会在初始化的时候调用+layerClass
方法来创建宿主图层。就像这样
+ (Class)layerClass
{
return [CATextLayer class];
}
- (CATextLayer *)textLayer
{
return (CATextLayer *)self.layer;
}
CAReplicatorLayer
接下来说一个很有意思的Layer
CAReplicatorLayer
是为了高效生成许多相似的图层,他会复制一个或多个图层的子视图,并在每个子视图上应用不同的变换。
这个Layer用起来也不难
instanceCount
指定图层需要复制多少次。
instanceTransform
指定一个3D变换。变换是逐步增加的。每个实例都是相对于前一个实例布局。
instanceBlueOffset
和 instanceGreenOffset
实现逐步减少蓝色和绿色通道.
好玩的应用在这里
CAReplicatorLayer
的一个实际应用是:反射。
使用 CAReplicatorLayer
并应用一个负比例变换于一个复制图层。就可以创建指定内容视图的镜像图片。这样就创建了一个“反射”的实时效果。
show code
CATransform3D transform = CATransform3DIdentity;
CGFloat verticalOffset = self.bounds.size.height + 2;
transform = CATransform3DTranslate(transform, 0, verticalOffset, 0);
transform = CATransform3DScale(transform, 1, -1, 0);
layer.instanceTransform = transform;
//reduce alpha of reflection layer
layer.instanceAlphaOffset = -0.6;
CAScrollLayer
简单介绍一下
CAScrollLayer
就是可以显示大图的一小部分。他有一个方法
scrollToPoint:
自动适应 bounds
的圆点使图层内容出现在滑动的地方。
CAScrollLayer
不处理边界检查,内容完全可以超出边界。
CAScrollLayer
的头文件中有一个 CALayer
的分类。这个分类中定义了两个方法
- (void)scrollPoint:(CGPoint)p;
- (void)scrollRectToVisible:(CGRect)r;
这两个方法的作用就是在图层树中查找并找到第一个可用的CAScrollLayer
。然后滑动它使得指定点成为可视的。
CATiledLayer
CATiledLayer优化了哪方面的需求?
解决在iOS平台进行大图载入和绘制带来的性能问题。比如高像素的图片或者是地图
CATiledLayer
可以将大图分解成小片然后把它们按需加载。
开始搞起
首先我们要把一张大图分解成很多个小图。这个过程可以在Mac端进行。
然后我们有了这些小图之后,把CATiledLayer
和UIScrollView结合使用。在滑动的时候再加载需要的小图。关键代码写在drawLayer:(CATiledLayer *)layer inContext:(CGContextRef)ctx
方法里面。当需要载入新的小图的时候,CATiledLayer
就会调用这个方法:
- (void)drawLayer:(CATiledLayer *)layer inContext:(CGContextRef)ctx
{
//determine tile coordinate
CGRect bounds = CGContextGetClipBoundingBox(ctx);
NSInteger x = floor(bounds.origin.x / layer.tileSize.width);
NSInteger y = floor(bounds.origin.y / layer.tileSize.height);
NSString *imageName = [NSString stringWithFormat: @"Snowman_%02i_%02i", x, y];
NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@"jpg"];
UIImage *tileImage = [UIImage imageWithContentsOfFile:imagePath];
//draw tile
UIGraphicsPushContext(ctx);
[tileImage drawInRect:bounds];
UIGraphicsPopContext();
}
最后,我们需要设置CATiledLayer
的 contentsScale
来匹配屏幕像素 。然后把下述代码也进行修改
CGFloat scale = [UIScreen mainScreen].scale;
NSInteger x = floor(bounds.origin.x / layer.tileSize.width * scale);
NSInteger y = floor(bounds.origin.y / layer.tileSize.height * scale);
这个时候大图的尺寸将会以一半的大小显示出来。
AVPlayerLayer
AVPlayerLayer
是AVFoundation框架提供的CALayer的子类来显示自定义的内容。
可以使用AVPlayerLayer
在iOS上播放视频。是高级接口例如MPMoivePlayer的底层实现。
show Code
AVPlayer *player = [AVPlayer playerWithURL:URL];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
当然。做为CALayer的子类,我们可以对这个图层做圆角、边框、蒙版、阴影等效果。
iOS核心动画(专用图层篇)的更多相关文章
- iOS核心动画高级技巧之图层变换和专用图层(二)
iOS核心动画高级技巧之CALayer(一) iOS核心动画高级技巧之图层变换和专用图层(二)iOS核心动画高级技巧之核心动画(三)iOS核心动画高级技巧之性能(四)iOS核心动画高级技巧之动画总结( ...
- IOS 动画专题 --iOS核心动画
iOS开发系列--让你的应用“动”起来 --iOS核心动画 概览 通过核心动画创建基础动画.关键帧动画.动画组.转场动画,如何通过UIView的装饰方法对这些动画操作进行简化等.在今天的文章里您可以看 ...
- iOS核心动画高级技巧之核心动画(三)
iOS核心动画高级技巧之CALayer(一) iOS核心动画高级技巧之图层变换和专用图层(二)iOS核心动画高级技巧之核心动画(三)iOS核心动画高级技巧之性能(四)iOS核心动画高级技巧之动画总结( ...
- iOS核心动画高级技巧之CALayer(一)
iOS核心动画高级技巧之CALayer(一) iOS核心动画高级技巧之图层变换和专用图层(二)iOS核心动画高级技巧之核心动画(三)iOS核心动画高级技巧之性能(四)iOS核心动画高级技巧之动画总结( ...
- iOS核心动画学习整理
最近利用业余时间终于把iOS核心动画高级技巧(https://zsisme.gitbooks.io/ios-/content/chapter1/the-layer-tree.html)看完,对应其中一 ...
- iOS 核心动画 Core Animation浅谈
代码地址如下:http://www.demodashi.com/demo/11603.html 前记 关于实现一个iOS动画,如果简单的,我们可以直接调用UIView的代码块来实现,虽然使用UIVie ...
- iOS核心动画高级技巧 - 8
iOS核心动画高级技巧 - 1 iOS核心动画高级技巧 - 2 iOS核心动画高级技巧 - 3 iOS核心动画高级技巧 - 4 iOS核心动画高级技巧 - 5 iOS核心动画高级技巧 - 6 iOS核 ...
- IOS 核心动画之CAKeyframeAnimation - iBaby
- IOS 核心动画之CAKeyframeAnimation - 简单介绍 是CApropertyAnimation的子类,跟CABasicAnimation的区别是:CABasicAnimation ...
- iOS核心动画以及UIView动画的介绍
我们看到很多App带有绚丽狂拽的特效,别出心裁的控件设计,很大程度上提高了用户体验,在增加了实用性的同时,也赋予了app无限的生命力.这些华丽的效果很多都是基于iOS的核心动画原理实现的,本文介绍一些 ...
随机推荐
- 7kyu kata
https://www.codewars.com/kata/isograms/train/java CW 大神 solution: public class isogram { public stat ...
- 洛谷 P1474 货币系统 Money Systems 题解
P1474 货币系统 Money Systems 题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1 ...
- NLP算法工程师(实习生)面试总结(持续更新)
爱奇艺 1. attention<attention is all you need> 2. 相关项目 3. 逻辑回归 4. linux的指令(重命名文件,vim替换,vim指向文章最末行 ...
- 转载:基于 Hive 的文件格式:RCFile 简介及其应用---推酷
Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度为优势.不过,MPP数据库社区也一直批评Hadoop由于文件格式并非为特定目的而建,因此序列化和反序 ...
- Linux系统学习(二)一Linux基本操作
一.Linux的目录结构 1.1 Linux的目录结构图 1.2 目录内容 /:这就是根目录.对你的电脑来说,有且只有一个根目录.所有的东西,我是说所有的东西都是从这里开始.举个例子:当你在终端里输入 ...
- Tomcat的安装以及环境变量的配置
目录 下载 解压并配置环境变量 测试 关闭服务 Tomcat启动时,控制台和IDEA控制台中文乱码解决方案 下载 官方网址:Apache Tomcat® https://tomcat.apache.o ...
- tmp 字典合并
tmp
- C# linq 使用Groupby lamda 获取非重复数据
).GroupBy(b => b.BasicUserId).Select(a => new MyServicesListViewModel() { HeadIcon = apiUrl + ...
- android -------- DES加密解密算法
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信 ...
- ISO/IEC 9899:2011 条款5——环境
5.环境 1.一个实现在两个不同的数据处理系统环境下分别翻译C源文件与执行C程序,在本国际标准中分别称为翻译环境和执行环境.它们的特征定义并包含了根据顺从标准实现的语法及语义规则所构造的顺从标准的C程 ...