私のメインビューには、サブビューとして実装されたいくつかの(おそらく多くの)多角形のアクティブエリアがあります。ユーザーがビューに触れたときに、彼女がそれらのアクティブな領域の1つに当たったかどうかを識別したいと思います。
すべての[可能性のある*]アクティブな領域のリストを反復処理し、ポイントがその中にあるかどうかをそれぞれに尋ねる、単純なアルゴリズムよりも優れたものはありますか?
hitTest:withEvent:
ドキュメントに「このメソッドは、非表示になっている、ユーザーインタラクションを無効にしている、またはアルファレベルが0.01未満のビューオブジェクトを無視する」と記載されているため、(オーバーライドせずに)使用できません。そして、私のサブビューは確かに隠されています(ほとんどの場合)。
私はこれらのオプションを見ることができます:
私自身の本格的な四分木実装を実装します。これは時期尚早の最適化の悪臭であり、Appleのヒットテストの実装はすでに最適化されていると私は期待しているので、これは車輪の再発明です
[possible *]領域を制限するには、最大および最小のx座標とy座標をそれぞれ維持し、最初にその長方形でヒットテストを行います。実際、私のサブビュー
frame
はそれらの長方形です。私はAppleのヒットテストがそれらを使うことを期待している。hitTest:withEvent:
サブビューのCocoaTouchをオーバーライドして、文書化された制限を削除します。うまくいけば、これが私のアプリに悪影響を与えることはありません(たとえば、サブビューでの誤ったタッチイベントを無視したり、メインビューに転送したりできます)。素朴であり、素朴なアルゴリズムのパフォーマンスが低下するために、ユーザーが実際に使用するアクティブな領域をあまり多く追加しないことを信頼してください。
なにか提案を?
ポリゴンは常に単純ですが、必ずしも凸状である必要はないことに注意してください。また、私が使用する最も正確なヒットテストは、Quartzルーチンを使用したものです。CGPathContainsPoint