1

私はウェブを少し検索して、私がやりたいことを行う方法についていくつかのアイデアを見つけましたが、それでもあなたが私が何をすべきだと思うか知りたいです。

コンテキストは次のとおりです。

私はiOS5用のアプリを開発しています。MapKitを使用して地図を表示し、それに約5000個の注釈を追加します-うん、それはたくさんのようですが、心配しないでください、私はクラスタリングライブラリを使用しています:)。ユーザーがマップを開くたびにそれらをロードしないようにするために、appDelegateでそれらを作成します(注釈の配列を作成し[_mapView addAnnotations:[appDelegate.annotationsToAdd allObjects]];、マップを開くときに呼び出します)。配列の作成には約10秒かかるannotationsToAddので、このソリューションはかなりうまく機能していると思います(マップを開くことが許可されるまで、この10秒間待つ必要がありますが、アプリの起動時に1回だけ待ちます) 。これらの注釈のそれぞれに、値の配列(15個の浮動小数点数)を含むオブジェクトへの「リンク」があります。今のところ、アノテーションを作成すると、subtitleメソッドはそれらの値の1つを返します。

マップのViewControllerには、2つのセグメント化されたコントロールがあります。最初のセグメントには3つのセグメントがあり、2番目のセグメントには5つのセグメントがあり、15の組み合わせがあります。これも、アノテーション内のオブジェクトの配列にある値と同じ数です:)。

ですから、私の問題が発生するのを見たことがあるかもしれませんが、マップ上のすべての注釈のサブタイトルを更新したいと思います(クラスターは、保持しているピンに基づいて平均値を提供するため、クラスター内の注釈も更新します)。また、注釈のサブタイトルの値に基づいて、annotationViewの色/画像を更新したいと思います。

私は間違っているかもしれませんが、私の調査によれば、それを行うには、すべての注釈を削除し、それらをすべて再作成する必要があることを理解しています。私の場合、これはオプションではないことを理解しています。コントロールの1つの値を変更するたびに、ユーザーを10秒待たせることはできません。

KVOに関する記事を見ました:それは実用的な解決策でしょうか?

NSNotificationについてはよくわかりませんが、使用する必要がありますか?

私は本当にあなたの助けに感謝します、そして私は私に私の明らかに珍しい状況で従うべきステップを私に示す詳細な答えをさらに感謝します。

前もって感謝します。

4

2 に答える 2

4

まず、クラスタリングライブラリを使用せずに、アノテーションを一度に追加する必要があります。

マップインターフェイスを構成するときは、すべての注釈オブジェクトをすぐに追加する必要があります。マップビューは、各注釈オブジェクトの座標データを使用して、対応する注釈ビューを画面に表示する必要がある時期を決定します。

MKMapViewクラスリファレンスから)。

MKMapViewがそれらを管理するので、アプリの速度が低下することはありません。このアプローチは、おそらくあなたがしていることよりも遅くなることはなく、理論的には次のことができます。

[mapView removeAnnotations:mapView.annotations];
//add your annotations here

それらをすべて削除してから、すべて追加し直したい場合。

ただし、それらをすべて一度に削除する必要があるというのは誤りです。特定の注釈を知っている場合は、次のようにするだけです。

[mapView removeAnnotation:someAnnotation];
[mapView addAnnotation:someOtherAnnotation];

NSArrayに置換がある場合は、次のこともできます。

[mapView removeAnnotations:arrayOfOldAnnotations];
[mapView addAnnotations:arrayOfNewAnnotations];

最後に、注釈を変更したい場合は、KVOを使用して変更できます(このStack Overflowの質問を参照)が、削除してから追加するのも同じくらい簡単で、ユーザーはあなたがいない限り気付かないでしょう。追加をアニメーション化しません。

于 2012-10-01T00:05:21.560 に答える
2

ようやく状況がよくわからなくて申し訳ありませんが、同様の問題を解決しようと思っているので、考えを共有していきたいと思います。私はあなたの言葉を私の応答のガイドとして使用します:

「地図を開くことが許可される前に、それらの10秒間待つ必要があります」

<MKOverlayView>次のプロトコルメソッドについて知っていますか( http://developer.apple.com/library/IOs/#documentation/MapKit/Reference/MKOverlayView_class/Reference/Reference.htmlを参照)。

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
- (BOOL)canDrawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale

(世界地図全体に5000個のピンがあり、fx 1kmごとではなく、ピンの数がそれほど多くないと仮定します)5000を部分に分割できるため、ピンの各部分には、対応するMKMapRect領域が配置されます。地図上に描かれています。そのため、マップには、特定の地域の特定の時間にのみ、需要に応じてピン/注釈が入力されます。状況によっては、これにより大幅なスピードアップがもたらされる可能性があります。

これは、MKMapRectタイルを操作するための非常に優れたデモンストレーションです。https ://github.com/mtigas/iOS-MapLayerDemo-特定のマップ部分のみの情報を入力します。またgoogle、「マップタイル256px」のように、マップがどのように描画されているかを理解することもできます。

「それを行うには、すべての注釈を削除し、それらをすべて再作成する必要があることを理解しています。」

なぜ再作成するのですか?マップ上にすでに存在するすべてのアノテーションにアクセスできます。関連するアノテーションクラスを繰り返し処理して、サブタイトルを更新してみませんか?

何かのようなもの:

私のポイントがあなたの質問/状況の範囲に対応していることを願っています。

于 2012-09-30T22:50:07.823 に答える