我有一个打开的 CGPath/UIBezierPath,我想检测用户是否触摸它,即某个点是否在距路径一定距离内。路径是开放的(即直线/曲线,而不是形状)。它可以包含直线和曲线元素。如何获得到路径的距离来进行命中测试?
CGPath/UIBezierPath 似乎都没有执行此操作的函数。编辑:根据@nielsbot的建议,您可以使用编写自定义实现CGPathApply(…)
。不过,计算到弯曲部分的距离并不是那么简单。
然而,我找到了一种巧妙的方法来实现我最初的目标,即对路径进行命中测试: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。也可以通过使用以下命令将原始路径添加到 hitPath 来用于闭合路径CGPathAddPath(…)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)