绘制不规则图形并响应点击事件

1,884 阅读1分钟

需求

绘制一个不规则图形并能响应点击事件

思路

1.使用CAShapeLayer绘制图形

2.在点击屏幕时判断触摸点是否落在CAShapeLayerpath内部

实现

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检查自己是否合适。