我有一个开放的 CGPath/UIBezierPath,我想检测用户是否触摸它,即一个点是否在距离路径一定距离内。路径是开放的(即一条线/曲线,而不是一个形状)。它可以包含直线和曲线元素。如何获得到路径的距离以对其进行 HitTest ?

最佳答案

似乎 CGPath/UIBezierPath 都没有执行此操作的功能。编辑:根据@nielsbot 的建议,您可以使用 CGPathApply(…) 编写自定义实现。不过,计算到弯曲部分的距离并不是那么简单。

但是,我找到了一种巧妙的方法来实现我的原始目标,即对路径进行 HitTest : CGPathCreateCopyByStrokingPath(…)

- (BOOL)isPoint:(CGPoint)p withinDistance:(CGFloat)distance ofPath:(CGPathRef)path
{
    CGPathRef hitPath = CGPathCreateCopyByStrokingPath(path, NULL, distance*2, kCGLineCapRound, kCGLineJoinRound, 0);
    BOOL isWithinDistance = CGPathContainsPoint(hitPath, NULL, p, false);
    CGPathRelease(hitPath);
    return isWithinDistance;
}

为了获得更好的性能,您可以缓存 hitPath。也可以通过使用 CGPathAddPath(…) 将原始路径添加到 hitPath 来用于封闭路径

10-08 16:56