我的containsPoint方法有问题。我画了一些盒子和盒子之间的连接器。连接器基本上是基于单个曲线ToPoint:controlPoint1:controlPoint2调用的单个曲线。当我现在尝试用鼠标选择这个曲线/路径时,这很难做到。containsPoint:方法似乎非常敏感。我试着把线画得更大(setLineWidth:),但这似乎没有帮助。
有什么不同的想法吗?
对于CGPath,您可以始终使用创建一个闭合路径,该路径是笔划路径的轮廓
CGPathRef strokedPath = CGPathCreateCopyByStrokingPath(
path, // your original CGPathRef
NULL, // don't transform
10.0, // lineWidth
kCGLineCapButt, // lineCap (default value)
kCGLineJoinMiter, // lineJoin (default value)
0.0 // miterLimit
);
你可以在这里(Ole Begemann)和这里(Rob Napier)阅读更多关于路径命中测试的信息。
感谢David的回答,我现在可以提供完整的答案了。我需要三个部分。
- 将NSBezierPath转换为CGPath。这可以按照Apple文档中提供的方式进行。或者您可以使用https://github.com/iccir/XUIKit库,它将iPhone框架功能添加到MacOS框架中
- 按照David的建议使用CGPathCreateCopyByStrokingPath函数
- 将新的CGPath转换为NSBezierPath。David链接到Ole Begemann的区块非常有助于展示如何做到这一点。然而,XUIKit再次领先一步,并提供了
+(NSBezierPath) bezierPathWithCGPath:
功能
结果是这样的。
//con as Connector was the starting point
CGPathRef tapTargetPath = CGPathCreateCopyByStrokingPath(con.CGPath, NULL, 4, kCGLineCapButt, kCGLineJoinBevel, kCGLineJoinMiter );
NSBezierPath * hitPath = [NSBezierPath bezierPathWithCGPath:tapTargetPath];