CALayer類在概念上和UIView類似婉宰,同樣也是一些被層級關(guān)系樹管理的矩形塊貌笨,同樣也可以包含一些像圖片耳奕,文本或者背景的內(nèi)容。和UIView最大的不同是CALayer不處理用戶的交互盆顾。但它有一系列的方法幫你處理事件:-containsPoint和-hitTest怠褐。
使用containsPoint判斷被點擊的圖層
<pre>import UIKit
class ViewController: UIViewController {
var layerView: UIView!
var blueLayer: CALayer!
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.gray
self.initBlueLayer()
}
func initBlueLayer()
{
self.layerView = UIView()
self.layerView.backgroundColor = UIColor.white
self.layerView.frame = CGRect(x: 100, y: 200, width: 200, height: 200)
self.view.addSubview(self.layerView)
self.blueLayer = CALayer()
self.blueLayer.frame = CGRect(x: 20, y: 20, width: 160, height: 160)
self.blueLayer.backgroundColor = UIColor.blue.cgColor
self.layerView.layer.addSublayer(self.blueLayer)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
let touch = touches.first! as UITouch
var point = touch.location(in: self.view)
point = self.layerView.layer.convert(point, from: self.view.layer)
if self.layerView.layer.contains(point)
{
point = self.blueLayer.convert(point, from: self.layerView.layer)
if self.blueLayer.contains(point)
{
print("Inside Blue Layer")
}else
{
print("Inside White layer")
}
}
}</pre>
點擊藍(lán)色區(qū)域打印:Inside Blue Layer
點擊白色區(qū)域打幽堋:Inside White layer
使用hitTest判斷被點擊的圖層
<pre>import UIKit
class ViewController: UIViewController {
var layerView: UIView!
var blueLayer: CALayer!
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.gray
self.initBlueLayer()
}
func initBlueLayer()
{
self.layerView = UIView()
self.layerView.backgroundColor = UIColor.white
self.layerView.frame = CGRect(x: 100, y: 200, width: 200, height: 200)
self.view.addSubview(self.layerView)
self.blueLayer = CALayer()
self.blueLayer.frame = CGRect(x: 20, y: 20, width: 160, height: 160)
self.blueLayer.backgroundColor = UIColor.blue.cgColor
self.layerView.layer.addSublayer(self.blueLayer)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
let touch = touches.first! as UITouch
let point = touch.location(in: self.view)
let layer = self.layerView.layer.hitTest(point)
if layer == self.blueLayer
{
print("Inside Blue Layer")
}else if layer == self.layerView.layer
{
print("Inside White layer")
}else{
print("123")
}
}
}
</pre>
點擊藍(lán)色區(qū)域打幽卫痢:Inside Blue Layer
點擊白色區(qū)域打印:Inside White layer
1.png