- 示例 #1:CALayer
- 示例 #2:CAScrollLayer
- 示例 #3:CATextLayer
- 示例 #4:AVPlayerLayer
- 示例 #5:CAGradientLayer
- 示例 #6:CAReplicatorLayer
- 示例 #7:CATiledLayer
- 示例 #8:CAShapeLayer
- 示例 #9:CATransformLayer
CALayer还有两个附加属性有助于改善性能:shouldRasterize和drawsAsynchronously。
shouldRasterize默认为false,设为true可以改善性能,因为图层内容只需要一次渲染。相对画面中移动但自身外观不变的对象效果拔群。
drawsAsynchronously默认值也是false。与shouldRasterize相对,该属性适用于图层内容需要反复重绘的情况,此时设成true可能会改善性能,比如需要反复绘制大量粒子的粒子发射器图层(可以参考后面的CAEmitterLayer示例)。
http://www.cnblogs.com/lzlsky/p/4011826.html
Swift语言iOS开发:CALayer十则示例
http://www.cocoachina.com/ios/20150318/11350.html
各种Layer
http://www.15yan.com/story/gBdPD09UWFT/
二、CAGradientLayer
CAGradientLayer用来绘制渐变色,指定几个颜色值、渐变结束位置,就能在layer中绘制出渐变效果。下面是一段例子:
![](https://img.haomeiwen.com/i261198/aa393fea2497ebe4.png!content)
例子中的layer是加在一个UIImageView之上的,设置为半透明,在渐变色下显示出图片内容。colors指定渐变色选取红色、绿色和蓝色三色。locations设置了红色与绿色的渐变区域在20%与50%之间,小于20%的位置为红色,50%位置为绿色,绿色与蓝色的渐变区域在50%与80%之间,大于80%的位置为蓝色。startPoint设置为左上角,endPoint设置为右下角,颜色从左上角逐渐变到右下角。
示例 #3:CATextLayer
CATextLayer能够对普通文本或属性字串进行简单快速的渲染。与UILabel不同,CATextLayer无法指定UIFont,只能使用CTFontRef或CGFontRef。
像下面这样的代码完全可以掌控文本的字体、字体大小、颜色、对齐、折行(wrap)和截断(truncation)规则,也有动画效果:
// 1
let textLayer = CATextLayer()
textLayer.frame = someView.bounds
// 2
var string = ""
for _ in 1...20 {
string += "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor arcu quis velit congue dictum. "
}
textLayer.string = string
// 3
let fontName: CFStringRef = "Noteworthy-Light"
textLayer.font = CTFontCreateWithName(fontName, fontSize, nil)
// 4
textLayer.foregroundColor = UIColor.darkGrayColor().CGColor
textLayer.wrapped = true
textLayer.alignmentMode = kCAAlignmentLeft
textLayer.contentsScale = UIScreen.mainScreen().scale
someView.layer.addSublayer(textLayer)
以上代码解释如下:
创建一个CATextLayer实例,令边界与someView相同。
重复一段文本,创建字符串并赋给文本图层。
创建一个字体,赋给文本图层。
将文本图层设为折行、左对齐,你也可以设自然对齐(natural)、右对齐(right)、居中对齐(center)或两端对齐(justified),按屏幕设置contentsScale属性,然后把图层添加到视图结构树。
不仅是CATextLayer,所有图层类的渲染缩放系数都默认为1。在添加到视图时,图层自身的contentsScale缩放系数会自动调整,适应当前画面。你需要为手动创建的图层明确指定contentsScale属性,否则默认的缩放系数1会在Retina显示屏上产生部分模糊。
四、CAScrollLayer
CAScrollLayer提供了和UIScrollView的基本功能。只不过它是layer,只负责显示,不响应用户事件,也不提供滚动条。例子如下:
![](https://img.haomeiwen.com/i261198/71bb6b192d9e9516.png)
CAScrollLayer上添加一个子layer,layer的内容是一张大图片,scrollLayer又作为一个子layer加到当前view中。在当前View上添加了手势,当触发平移手势时,获取平移的量,调用CAScrollLayer的scrollToPoint方法,让scrollLayer滚动一定位置。设置scrollMode为两个方向均可滚动,来允许向各个方向滚动,也可以限制只能在一个方向上滚动。
示例 #6:CAReplicatorLayer
CAReplicatorLayer能够以特定次数复制图层,可以用来创建一些很棒的效果。
每个图层复件的颜色和位置都可以改动,而且可以在总复制图层之后延迟绘制,营造一种动画效果。还可以利用深度,创造三维效果。举个例子
示例 #7:CATiledLayer
CATiledLayer以图块(tile)为单位异步绘制图层内容,对超大尺寸图片或者只能在视图中显示一小部分的内容效果拔群,因为不用把内容完全载入内存就可以看到内容。
于在drawRect() 根据块的大小,会会调用很多次;
通过CGContextGetClipBoundingBox方法获取到了需要绘制的图形上下文的位置与大小
CGContextRef context = UIGraphicsGetCurrentContext();
NSLog(@"layer CGContextRef %@",NSStringFromCGAffineTransform(CGContextGetCTM(context)));
override func drawRect(rect: CGRect) {
let firstColumn = Int(CGRectGetMinX(rect) / sideLength)
let lastColumn = Int(CGRectGetMaxX(rect) / sideLength)
let firstRow = Int(CGRectGetMinY(rect) / sideLength)
let lastRow = Int(CGRectGetMaxY(rect) / sideLength)
levelsOfDetail 为一共要绘制多少层的位置 不同zoomscale 的值(包括1);
levelsOfDetailBias表示比1大的位置里有多少层 不同zoomscale 的值 drawLayer的位置(不包含1)
因为levelsOfDetailBias 默认为0 ,所以 levelsOfDetail 默认表示scrollview 缩小的zoomscale层数;
levelsOfDetailBias = m表示,将原来的1/2,移到2^m倍的位置。假设levelsOfDetail = n,levelsOfDetailBias = m的话,会有如下队列:
2^m * 2^-1 -> 2^m * 2^-2 -> … -> 2^m * 2^-n
简化一下即
2^(m – 1) -> 2^(m – 2) -> 2^(m – 3) ->… -> 2^(m – n)
举例,levelsOfDetail = 3,levelsOfDetailBias = 3,则你的UIScrollView将会在以下zoomScale时drawLayer
2^(3 – 1) -> 2^(3 – 2) -> 2^(3 – 3) 。即 4 -> 2 -> 1。
网友评论