2012-10-19 12 views
11

注釈が選択されたときにユーザーが保存をタップすると、マップビューのサムネイルを保存しようとしています。この問題は、ユーザーがその注釈をまだズームしていない場合に発生し、クローズズームレベルがロードされていない場合に発生します。MKMapViewを使用すると、デリゲートの読み込みが完了しました。

これは、ユーザーのタップは、保存した後、私がやっているものです:

  1. 真のセンターに「保存」ブール値を設定し、注釈(アニメーション)にズームイン
  2. ときmapViewDidFinishLoadingMapデリゲートメソッドが呼び出され、保存がtrueの場合:
  3. ビューからUIImageを作成して保存します。モーダルビューを閉じます。以下に示すように

は、画像が保存されただし場合、ビューは私はまだグリッド線とアンロードマップを見るように、実際には終了していないローディング保存結果画像を却下される:

Gridlines unfinished

私の質問は、このサムネイルを保存する前に地図のロードが完了して表示が終了していることを確認するにはどうすればいいですか?

+0

私はこれに関連したアップルのバグ#13774496を提出し、問題がまだiOS6に存在を示すためにサンプルアプリを作成しました:https:// github。com/iwasrobbed/MapKitDelegateBug – iwasrobbed

答えて

15

アップデート:iOS7にはnew delegateがあり、この問題が修正されている可能性があります。私はどちらか一方の方法をまだ確認していません。

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered 

前iOS6のサポート:

mapViewDidFinishLoadingMapunreliableように見えます。私は時には地図のタイルがすでにキャッシュされていて、それが複数回呼び出されることがある場合は、まったく呼び出されないことに気付きます。

私は、複数回呼び出されたときに最後の呼び出しが正しくレンダリングされることに気付きました。だから私はあなたが2回のタイマーを設定する場合は、ユーザーがタップを保存した後にこれを動作させることができると思う。他に何も起こらないようにインタラクションを無効にし、タイマーが終了したときにユーザーのやりとりを有効にします。

mapViewDidFinishLoadingMapが呼び出されると、2秒後にもう一度タイマーをリセットします。最終的にタイマーが消えたら、マップのスナップショットを取得してください。正しいものでなければなりません。

mapViewDidFailLoadingMapなどの他のコールバックも考慮する必要があります。また、タイルをフェッチするのに時間がかかる場合は、2秒で十分ではない可能性があるので、これをノイズの多い接続でテストしてください。

- (void)restartTimer 
{ 
    [self.finishLoadingTimer invalidate]; 
    self.finishLoadingTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 
                   target:self 
                  selector:@selector(mapLoadingIsFinished) 
                  userInfo:nil 
                   repeats:NO]; 
} 

- (void)userClickedSave 
{ 
    assert(self.saving == NO); 
    if (self.saving == NO) { 
     self.saving = YES; 
     assert(self.finishLoadingTimer == nil); 
     self.view.userInteractionEnabled = NO; 
     [self restartTimer]; 
    } 
} 

- (void)mapLoadingIsFinished 
{ 
    self.finishLoadingTimer = nil; 
    [self doSnapshotSequence]; 
    self.saving = NO; 
    self.view.userInteractionEnabled = YES; 
} 

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView 
{ 
    if (self.saving) { 
     [self restartTimer]; 
    } 
} 
+0

上記のコードでは、mapLoadingIsFinished:メソッドは、ユーザーが保存をタップしたときにmapViewDidFinishLoadingMap:メソッドで呼び出されます。保存する場合はYESですが、その質問では、「彼はまだMapViewDidFinishLoadingMap:メソッドが呼び出された後でも、グリッド線は ".. ..これはとにかく動作するとは思わない –

+0

@RA上記で言及したように、mapLoadingIsFinishedは複数回呼び出され、最後に信頼できると呼ばれます。このコードはそれを利用しています。コードを試して、問題がある場合はお知らせください。 – Skotch

0

スクリーンショットを撮っている領域には、適用しているズームレベルがサポートされていますか?たとえば、米国のズームレベルのサポートが高い場合は、最大の詳細をズームインできますが、アジアではズームレベルが高い場合はサポートされない場合があります。

関連する問題