[在此输入图像描述] [1]我有一个未闭合结构的bezierpath。我想只在点击路径时检测水龙头,而不是在路径所包围的区域上点击。如果我使用path.contains,它甚至对于路径所包含的水龙头也是如此。
bezier.contains(touchPoint)
有灰色路径,使用下面的代码创建,我想只检测灰色部分的点击,而不是灰色部分包围的区域内。
let color:UIColor = getColor(structure.category)
let bpath:UIBezierPath = UIBezierPath()
beziers.append(bpath);
bpath.move(to: structure.points[0].fromPoint)
for point in structure.points {
bpath.addCurve(to: point.toPoint, controlPoint1:point.controlPointOne, controlPoint2: point.controlPointTwo)
}
bpath.lineWidth = 5.0
color.set()
bpath.stroke()
答案 0 :(得分:1)
通过获取UIBezierPath的path
属性(即CGPath)并在该CGPath上调用copy(strokingWithWidth:)
,将笔划转为闭合路径。现在您有一个封闭路径(或多个封闭路径),您可以成功使用CGPath contains
方法。
答案 1 :(得分:0)
不容易发现任何一个点是bezierPath
,但我有一个技巧。
要检测点是否位于任何形状上,请将其以颜色C
渲染到位图,获取与您的坐标对应的像素并检查该像素的颜色。如果它是C
那么这一点就在你的形状上,否则就不会。
答案 2 :(得分:0)
下面的@ matt解决方案是确定原始路径附近是否有点的好方法。它类似于使用CGPathCreateCopyByStrokingPath
的{{3}}。
另一种选择是使用我编写的solution in this question库,其中包含closestPointOnPathTo:
方法。然后你可以用伪代码:
CGPoint pointOnPath = [myBezierPath closestPointOnPathTo:touchPoint];
CGFloat distToPath = distanceBetweenPoints(pointOnPath, touchPoint);
if(distToPath < 5) ...
根据您的需要,这可能有些过分,或者可能会提供一些额外有用的bezier工具,具体取决于您对路径的其他操作。