NSBezierPath containsPoint:在路径未关闭时过于敏感



我的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的回答,我现在可以提供完整的答案了。我需要三个部分。

  1. 将NSBezierPath转换为CGPath。这可以按照Apple文档中提供的方式进行。或者您可以使用https://github.com/iccir/XUIKit‎库,它将iPhone框架功能添加到MacOS框架中
  2. 按照David的建议使用CGPathCreateCopyByStrokingPath函数
  3. 将新的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];

相关内容

  • 没有找到相关文章

最新更新