1.CALayer與UIView
UIView繼承自UIResponder,可以響應觸摸事件。
CALayer繼承自NSObject,用于實際的圖層內容管理。
iOS中每個視圖都有一個與之關聯的CALayer,用于管理圖層內容。
2.CALayer簡單使用
class ViewController: UIViewController {
var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageView = UIImageView(frame: CGRect(origin: view.center, size: CGSize(width: 200, height: 200)))
setUpLayer(layer: imageView.layer)
view.addSubview(imageView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func setUpLayer(layer: CALayer) {
//背景色
layer.backgroundColor = UIColor.blue.cgColor
//邊框寬度
layer.borderWidth = 2
//邊框顏色
layer.borderColor = UIColor.red.cgColor
//陰影透明度
layer.shadowOpacity = 0.7
//陰影角度
layer.shadowRadius = 10
}
}
效果如圖:
屏幕快照 2017-08-24 下午2.55.02.png
在上面的代碼中,我們做了下面的事情:
1.把圖層背景顏色設置為藍色
2.將邊框寬度從默認值0改為2
3.將邊框的顏色設置為紅色
4.設置了陰影,透明度從0設置為0.7,并將陰影半徑設置為10
接下來,在setUpLayer方法中加入如下代碼,添加內容:
//設置內容
layer.contents = UIImage(named: "111.png")?.cgImage
//設置內容模式
layer.contentsGravity = kCAGravityCenter
結果如圖:
屏幕快照 2017-08-24 下午3.03.00.png
由于contentsGravity我們設置的是center,該模式會把按照圖片原大小顯示,而我們的圖片沒有imageView大,就導致不會占滿整個imageView。這里可以選擇拉伸剪切模式,讓圖片適應imageView。
3.添加手勢
我們給imageView添加點擊和捏合手勢,如下:
override func viewDidLoad() {
super.viewDidLoad()
imageView = UIImageView(frame: CGRect(origin: CGPoint(x: view.center.x-100, y: view.center.y-100), size: CGSize(width: 200, height: 200)))
let tap = UITapGestureRecognizer(target: self, action: #selector(tap(tap:)))
let pinch = UIPinchGestureRecognizer(target: self, action: #selector(pinch(pinch:)))
imageView.addGestureRecognizer(tap)
imageView.addGestureRecognizer(pinch)
//需要有這句,才能開啟UIImageView的交互
imageView.isUserInteractionEnabled = true
setUpLayer(layer: imageView.layer)
view.addSubview(imageView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func tap(tap: UITapGestureRecognizer) {
//改變陰影的透明度
imageView.layer.shadowOpacity = imageView.layer.shadowOpacity == 0.7 ? 0 : 0.7
}
func pinch(pinch: UIPinchGestureRecognizer) {
let offset: CGFloat = pinch.scale < 1 ? 5.0 : -5.0
let oldFrame = imageView.layer.frame
let oldOrigin = oldFrame.origin
let newOrigin = CGPoint(x: oldOrigin.x + offset, y: oldOrigin.y + offset)
let newSize = CGSize(width: oldFrame.width + (offset * -2.0), height: oldFrame.height + (offset * -2.0))
let newFrame = CGRect(origin: newOrigin, size: newSize)
if newFrame.width >= 100.0 && newFrame.width <= 300.0 {
imageView.layer.borderWidth -= offset
imageView.layer.cornerRadius += (offset / 2.0)
imageView.layer.frame = newFrame
}
}
稍微修改了一下imageview的位置,讓它居中,方便模擬器上面控制:
屏幕快照 2017-08-24 下午3.35.58.png
放大:
屏幕快照 2017-08-24 下午3.41.52.png
縮小:
屏幕快照 2017-08-24 下午3.42.00.png
點擊手勢,是使imageview周圍的陰影消失。捏合手勢,使imageview的邊框變寬和變窄。(在邊窄的時候,不會修改了圖層的內容,除非把圖層的masksToBounds設置為true。設置為true后,圖層內容會隨著變寬的變化而變化。)
設置為true后縮小:
屏幕快照 2017-08-24 下午3.40.29.png
CALayer還有一些地方需要知道:
- 1.圖層還可以添加圖層,跟View可以添加View一樣
- 2.圖層屬性是可以設置動畫的,圖層屬性改變時,可以自定義動畫時間
- 3.圖層比View更加輕巧,有助于提高性能
- 4.圖層比View具有更多的屬性。
4.添加圖層
// 創建CALayer
let layer = CALayer()
layer.frame = someView.bounds
//設置圖像
layer.contents = UIImage(named: "111.png")?.CGImage
layer.contentsGravity = kCAGravityCenter
//指定放大圖像時使用的過濾器
layer.magnificationFilter = kCAFilterLinear
//幾何變化
layer.geometryFlipped = false
//背景顏色
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
// 設置邊界,圓角
layer.cornerRadius = 100.0
layer.borderWidth = 12.0
layer.borderColor = UIColor.whiteColor().CGColor
// 設置陰影
layer.shadowOpacity = 0.75
layer.shadowOffset = CGSize(width: 0, height: 3)
layer.shadowRadius = 3.0
someView.layer.addSublayer(layer)
CALayer還有兩個屬性shouldRasterize和drawsAsynchronously可以提高性能。
shouldRasterize默認為false,設置為true可以提高性能,因為設置后圖層的內容只需要呈現一次。用在圖層設置之前。
drawsAsynchronously默認為false,設置為true可以提高性能,當層的內容必須重新繪制時,可以提高性能。用在圖層設置完畢后。
5.常用屬性
屬性 | 作用 |
---|---|
contentsGravity | 內容的模式 |
displayContents | 是否展示內容 |
geometryFlipped | 幾何翻轉 |
hidden | 是否隱藏 |
opacity | 透明度 |
cornerRadius | 圓角角度 |
borderWidth | 邊框寬度 |
borderColor | 邊框顏色 |
backgroundColor | 背景顏色 |
shadowOpacity | 陰影透明度 |
shadowOffset | 陰影偏移 |
shadowRadius | 陰影圓角角度 |
shadowColor | 陰影顏色 |
magnificationFilter | 放大時的過濾器 |