Calayer

  • 示例 #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中绘制出渐变效果。下面是一段例子:


Calayer_第1张图片

例子中的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,只负责显示,不响应用户事件,也不提供滚动条。例子如下:

Calayer_第2张图片
Paste_Image.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。

nonzero字面意思是“非零”。按该规则,要判断一个点是否在图形内,从该点作任意方向的一条射线,然后检测射线与图形路径的交点情况。从0开始计数,路径从左向右穿过射线则计数加1,从右向左穿过射线则计数减1。得出计数结果后,如果结果是0,则认为点在图形外部,否则认为在内部。下图演示了nonzero规则:
Calayer_第3张图片

evenodd字面意思是“奇偶”。按该规则,要判断一个点是否在图形内,从该点作任意方向的一条射线,然后检测射线与图形路径的交点的数量。如果结果是奇数则认为点在内部,是偶数则认为点在外部。下图演示了evenodd 规则:
Calayer_第4张图片

你可能感兴趣的:(Calayer)