CALayer
Layer的基本属性:
- Layers像Views有subviews一样,也有sublayers;
- 当你改变Layer的属性时,layer会自动动画,你也可以自定义动画时间;
- Layers比view更轻量级,所有它有更高的性能;
- Layers有很多有用的属性,接下来看一下这些属性。
// 1
let layer = CALayer()
layer.frame = someView.bounds
// 2
layer.contents = UIImage(named: "star")?.CGImage
layer.contentsGravity = kCAGravityCenter
// 3
layer.magnificationFilter = kCAFilterLinear
layer.geometryFlipped = false
// 4
layer.backgroundColor = UIColor(red: 11/255.0, green: 86/255.0, blue: 14/255.0, alpha: 1.0).CGColor
layer.opacity = 1.0
layer.hidden = false
layer.masksToBounds = false
// 5
layer.cornerRadius = 100.0
layer.borderWidth = 12.0
layer.borderColor = UIColor.whiteColor().CGColor
// 6
layer.shadowOpacity = 0.75
layer.shadowOffset = CGSize(width: 0, height: 3)
layer.shadowRadius = 3.0
someView.layer.addSublayer(layer)
在上面的代码中:
- 创建一个layer,给layer设置frame;
- 设置layer的content,居中,content中的image为CGImage;
- 通过contentGravity设置图片时,可以用这个属性;
- maskToBounds属性为false时layer的size比image小时,image不会被裁掉;
- 设置cornerRadius为layer的宽度的一半时,成了圆形,borderColor也要用CGColor;
- 创建layer的阴影。
CALayer还有两个附加属性:shouldRasterize,drawsAsynchronously:
- shouldRasterize默认为false, 当设置为true时可以提高性能因为layer的contents只需要渲染一次,这种适合在屏幕周围做动画但是不展现在屏幕上的对象;
- drawsAsynachronously 跟shouldRasterize相反,默认也为false, 当layer的contents需要不停地重绘时,需要设置为true以提高性能,例如:用emitter layer不停地渲染动画粒子时。
CAScrollLayer
UIScrollView 不用CAScrollLayer来工作,直接改变layer的bounds,可以对CAScrollLayer做的是设置滚动模式为水平或者垂直, 可以在程序中告诉它滚动到的点或者区域,
import UIKit
class ScrollingView: UIView {
// 1
override class func layerClass() -> AnyClass {
return CAScrollLayer.self
}
}
// In CAScrollLayerViewController.swift
import UIKit
class CAScrollLayerViewController: UIViewController {
@IBOutlet weak var scrollingView: ScrollingView!
// 2
var scrollingViewLayer: CAScrollLayer {
return scrollingView.layer as CAScrollLayer
}
override func viewDidLoad() {
super.viewDidLoad()
// 3
scrollingViewLayer.scrollMode = kCAScrollBoth
}
@IBAction func tapRecognized(sender: UITapGestureRecognizer) {
// 4
var newPoint = CGPoint(x: 250, y: 250)
UIView.animateWithDuration(0.3, delay: 0, options: .CurveEaseInOut, animations: {
[unowned self] in
self.scrollingViewLayer.scrollToPoint(newPoint)
}, completion: nil)
}
}
如果想用更轻量级的滚动,并且用程序设置滚动,可以用CAScrollLayer;
如果想用户自己滚动,最好用UIScrollView;
如果想滚动一个非常大的图片,考虑用CATiledLayer,在下文中有提到。
CATextLayer
CATextLayer 可以快速的渲染字符串,它不用 UIFont, 只用CTFontRef, CGFontRef
// 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实例
- 创建一个重复字符串
- 把字体赋值给它
- 设置字体的对齐方式
所有layer的类,默认为1倍渲染,当加到视图上时,layers自动为当前屏幕设置合适的contentsScale倍数,自己手动创建的layer需要明确的设置contentsScale, 否则它的倍数会为1,在高清屏上会失真。
可以设置很多参数,字体类型,字体大小,对齐方式,截断的位置(开始,结束,早间)。github代码