ユーザーがタッチしたかどうか、つまりポイントがパスから特定の距離内にあるかどうかを検出したい開いている CGPath/UIBezierPath があります。パスが開いています (つまり、形状ではなく直線/曲線)。直線要素と曲線要素の両方を含めることができます。パスまでの距離を取得してヒット テストするにはどうすればよいですか?
1225 次
2 に答える
7
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(…)
于 2013-10-19T06:53:31.877 に答える