需求
绘制一个不规则图形并能响应点击事件
思路
1.使用CAShapeLayer
绘制图形
2.在点击屏幕时判断触摸点是否落在CAShapeLayer
的path
内部
实现
1.画出不规则图形的path
:
private func createPolygonPath() -> CGPath {
let path = UIBezierPath()
path.move(to: CGPoint(x: 100, y: 200))
path.addLine(to: CGPoint(x: 100, y: 400))
path.addLine(to: CGPoint(x: 300, y: 400))
path.addLine(to: CGPoint(x: 100, y: 200))
return path.cgPath
}
2.画出需要的layer
:
private func createPolygonLayer() -> CALayer {
let polygonLayer = CAShapeLayer()
polygonLayer.fillColor = UIColor.purple.cgColor
polygonLayer.lineWidth = 1.0
polygonLayer.strokeColor = UIColor.red.cgColor
polygonPath = createPolygonPath()
polygonLayer.path = polygonPath!
return polygonLayer
}
4.重写drawRect方法形成不规则图形
override func draw(_ rect: CGRect) {
super.draw(rect)
self.layer.mask = createPolygonLayer()
}
5.重写pointInside方法只允许区域内可响应
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return polygonPath.contains(point)
}
事件响应规则是调用hitTest方法找到合适的responder,此时view作为responer会调用pointInside检查自己是否合适。