12

注釈が選択されているときにユーザーが保存をタップすると、マップビューのサムネイルを保存しようとしています。この問題は、ユーザーがまだその注釈を拡大していない場合に発生するため、クローズ ズーム レベルがロードされていません。

これは、ユーザーが保存をタップした後に行っていることです。

  1. ブール「保存」をtrueに設定します
  2. 注釈を中心にして拡大します (アニメーションなし)
  3. mapViewDidFinishLoadingMap デリゲート メソッドが呼び出され、保存が true の場合:
  4. ビューから UIImage を作成し、保存します。モーダル ビューを閉じます。

ただし、画像が保存され、ビューが閉じられると、保存された結果の画像は実際にはロードが完了していません。以下に示すように、グリッド線のあるアンロードされたマップがまだ表示されているためです。

グリッド線未完成

私の質問は、このサムネイルを保存する前に、マップの読み込みが完了し、表示が完了したことを確認するにはどうすればよいですか?

4

3 に答える 3

18

更新: iOS7 には、この問題を修正した可能性のある新しいデリゲートがあります。私はまだどちらかの方法で確認していません。

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

iOS6 以前のサポート:

mapViewDidFinishLoadingMap:信頼性がないようです。特にマップ タイルが既にキャッシュされている場合は、まったく呼び出されないこともあれば、複数回呼び出されることもあります。

複数回呼び出されると、最後の呼び出しが正しくレンダリングされることに気付きました。したがって、ユーザーが保存をタップした後に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];
    }
}
于 2013-01-17T00:51:28.767 に答える
5

iOS7 向けに開発する場合、使用する最適なデリゲートは次のとおりです: mapViewDidFinishRenderingMap:fullyRendered:

mapViewDidFinishRenderingMap:fullyRendered

于 2013-12-13T11:19:58.017 に答える
0

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

于 2013-01-22T15:02:25.727 に答える