如何在swift中检测打开(未关闭)BezierPath内的水龙头

时间:2017-02-28 15:46:06

标签: ios swift uibezierpath

[在此输入图像描述] [1]我有一个未闭合结构的bezierpath。我想只在点击路径时检测水龙头,而不是在路径所包围的区域上点击。如果我使用path.contains,它甚至对于路径所包含的水龙头也是如此。

bezier.contains(touchPoint)

The Path Image有灰色路径,使用下面的代码创建,我想只检测灰色部分的点击,而不是灰色部分包围的区域内。

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()

3 个答案:

答案 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工具,具体取决于您对路径的其他操作。