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

Davidの回答のおかげで、完全な回答を提供できるようになりました。私が必要としていたのは3つのパーツでした。

  1. NSBezierPath を CGPath に変換します。これは、Apple のドキュメントに記載されている方法で行うことができます。または、iPhone フレームワーク機能を MacOS フレームワークに追加するhttps://github.com/iccir/XUIKitライブラリを使用することもできます。
  2. David の提案に従って、CGPathCreateCopyByStrokingPath 関数を使用します。
  3. 新しい CGPath を NSBezierPath に変換します。Ole Begemann のブロックへの David のリンクは、その方法を示すのに非常に役立ちました。しかし、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 に答える