私がやりたいことについては、いくつかの悪い方法がありますが、これは「もっと良い方法があるに違いない」というケースの 1 つに思えます。
多数の注釈を表示する iPhone アプリで MKMapView を使用しています。米国の州の各町には注釈があるという概念的な議論のふりをして、画面上にかなり密集した注釈の山があるようにします。ユーザーがマップをズームアウトすると、それらの注釈が互いに重なり合い始め、重なり合って個別に選択するのが難しくなります。
私がやりたいのは、特定の密度の注釈 (注釈が重なっている場合など) で、それらの注釈を単一の注釈に統合し、それが多数のサブ注釈を囲んでいることを示すことです (「ズームインより多くの注釈が表示されます」)。
注釈ビューで CGRectIntersectsRect を呼び出すことはできますが、それを使用すると N^2 の問題が発生するようです。各注釈について各注釈を反復処理する必要があります。次の擬似コードを検討してください。
FOR firstAnnotationView IN allAnnotationViews
FOR secondAnnotationView in allAnnotationViews
IF CGRectIntersectsRect(firstAnnotationView.frame, secondAnnotationView.frame)
// 重複する 2 つの注釈が見つかりました。それらを統合します
ENDIF
ENDFOR
ENDFOR
なぜそれが遅いのか、そしてマップが拡大または縮小されるたびに実行しなければならないことがわかります!
では、マップ内の重複するアノテーションをどのように検出し、パフォーマンスに精通した方法でそれらをインテリジェントに統合するのでしょうか?