2011-02-04 8 views
1

私のUITableViewの各セルは、アノテーションを内部に持つ小さなMKMapViewを表示する必要があります。 私は自分のカスタムCellを作成し、そのMKMapViewをcellForRowAtIndexPathメソッドで設定することでこれを行うことができました。場所は私が以前構築した配列に基づいています。iPhone MKMapView in UITableViewCell

すべてうまくいきますが、MKMapViewsはUITableViewをスクロールするたびに更新されます。 MKMapViewsを「キャッシュ」する方法はありますか?

おかげ

+0

あなたはcellForRowAtIndexPathに新しいマップビューをalloc'ingしていますか、それらは配列に格納されていますか? – Rich

+0

いいえ、私はそれをすることはできませんでしたので、配列に格納されていません。私はviewDidLoad(配列は大丈夫でした)でMapViewsの配列を作成しようとしましたが、正しいmapViewをcellForRowAtIndexPathのindexPath.rowに基づいて取得しようとしましたが、mapViewsはすべてtableViewで同じでした。 –

+0

非常に奇妙です。私は問題が何であるか分からない。スクロールビューは、それらを入れ子にしたときに不思議な動作をするということだけがわかります。そのため、スクロールビューに似たものを使用するマップビューは、テーブルビュー内で正しく機能しない可能性があります。 @リチャード・ヴェナブルの提案を試して、各マップ・ビューに単一の場所を表示しようとすると、マップを画像に描画することができます。 – Rich

答えて

3

あなたはおそらくそれらを構成し、のviewDidLoadまたはawakeFromNibで配列に格納代わりに、cellForRowAtIndexPathでマップビューを設定すべきではありません。次に、cellForRowAtIndexPathにセルのマップビューを設定します。

+0

ありがとうございましたrichそれは私がcellForRowAtIndexPathで行ったことです:index(indexPath.row)のmapViewsDictionnaryのオブジェクトがnilの場合、mapViewを設定してmapViewsDictionnaryに追加します。そうでなければ、何もしないでください。それは動作しますが、本当にうまく最適化されているかどうかわかりません。 –

+0

遅延読み込みは遅くなる可能性がありますが、唯一の選択肢はviewDidLoadで行います。 1つの可能な最適化は、プロトタイプのように単一のマップビューをコピーすることです。その後、データで初期化します。 – Rich

8

あなたはここで説明する方法を使用して、MKMapViewのUIImageをキャッシュできます。Get map image from MKMapView

あなたはそのUIImageは、できるだけ頻繁に使用しており、ユーザーだけがそれと対話する必要があるときに実際のマップが表示されます。最高のパフォーマンスを得るには、テーブルビューでUIImageを常に使用してみてください。ユーザが行をタップすると、実際のマップをロードします(おそらく、独自のビューコントローラで)。

+1

このUIViewを表示せずにUIviewのUIImageを作成することは本当に可能ですか?あなたが言った解決策を試しましたが、マップがロード完了するのを待っていると空のイメージイベントが発生します。私はそれらのイメージを作成する前にMKMapViewsを表示しないという事実に起因するのだろうか... –

+0

地図のUIImageを自分で作成していないので、私はその投稿を見て、役に立つかもしれないと考えました。このスレッドで同じ問題についてさらに議論があります:http://stackoverflow.com/questions/4159596/make-a-imimage-from-a-mkmapview –

+0

また、このスレッドをチェックアウトする必要があります:http:// stackoverflow .com/questions/4591835/thumbnail-image-in-info-view-of-maps-app-is-uiimageview-or-mkmapview-or-something もう1つの不幸な問題が発生します。あなたの実装には不便かもしれないGoogleのロゴ。 –

0

@propertyを使用してヘッダファイルにuitableviewセルグローバルオブジェクトを作成し、セルがnilの場合はそのグローバルオブジェクトにそのセルを割り当てます。

次に、cellforrowatindexpathを入力するたびに、オブジェクトがnilであるかどうかを確認します。nilでない場合は、グローバルオブジェクトを返します。

// class.hで

@property (nonatomic, retain) UITableViewCell *mapCell; 

// cellForRowAtIndexPath

if (mapCell == nil) { 
         allocate the cell 
        } 
        else{ 
         return mapCell; 
        } 
0

良い方法がありますが、バックグラウンドTHEADのマップ(からイメージを作成するMKMapSnapshotterを使用中 - 無遅れ!)、ピンを手動で追加してから、画像をキャッシュして高速化することができます。私はここにいくつかのコードを提供しました - http://synappse.co/mkmapview-too-slow-use-preview/