0

我对 containsPoint 方法有疑问。我画了一些盒子和盒子之间的连接器。连接器基本上是一条曲线,基于单个 curveToPoint:controlPoint1:controlPoint2 调用。当我现在尝试用鼠标选择这条曲线/路径时,这很难做到。containsPoint: 方法似乎非常敏感。我试图把线画得更大(setLineWidth:),但这似乎没有帮助。

有什么想法我需要做不同的事情吗?

4

2 回答 2

1

对于 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撰写)阅读有关路径命中测试的更多信息。

于 2013-12-18T08:13:16.520 回答
0

感谢大卫的回答,我现在可以提供完整的答案。我需要的是三个部分。

  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];
于 2013-12-19T18:31:38.800 回答