我已经创建了一个定制的UIView,它绘制UIBezierPath,将其分配给CAShapeLayer,然后将其屏蔽到UIView的根层.现在,我try 使用以下代码确定不同的UIView是否与该自定义视图中的Bezier路径的任何部分相交(或重叠):
let customView = … // define UICustomView
let purpleView = UIView(frame: CGRect(x: 30, y: 500, width: 100, height: 50))
purpleView.backgroundColor = UIColor.purple
self.view.addSubview(purpleView)
if purpleView.frame.intersects((customView.shapeLayer.path?.boundingBoxOfPath)!) == true {
print("Overlapping")
} else {
print("Not overlapping")
}
唯一的问题是,只有当PurpleView位于部分正方形的左上角时,它才会返回True.下面的位置返回FALSE:
(如果与任何绿色重叠,则返回TRUE,否则返回FALSE.我只画了正方形的3条边,并故意将填充物留空)
以下是自定义视图的代码
class CustomView : UIView {
private var _path : UIBezierPath!
public let shapeLayer = CAShapeLayer()
override init(frame: CGRect) {
super.init(frame: frame)
self._setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self._setup()
}
private func _setup() {
self._createSquare()
}
private func _createSquare() {
self._path = UIBezierPath()
self._path.move(to: CGPoint(x: 0.0, y: 0.0))
self._path.addLine(to: CGPoint(x: 0.0, y: self.frame.size.height))
self._path.addLine(to: CGPoint(x: self.frame.size.width, y: self.frame.size.height))
self._path.addLine(to: CGPoint(x: self.frame.size.width, y: 0.0))
//self._path.close()
self.shapeLayer.path = self._path.cgPath
self.shapeLayer.lineWidth = 10
self.shapeLayer.strokeColor = UIColor.green.cgColor
self.backgroundColor = UIColor.green
self.shapeLayer.fillColor = nil
self.layer.mask = self.shapeLayer
}
}
有没有办法实现这一点?我意识到使用Frame.intersects()函数可能不是正确的方法.