30

MKMapViewsetCenterCoordinate:animated:メソッド(アニメーションなし)を呼び出した後、selectAnnotation:animated :(アニメーションあり)を呼び出して、注釈が新しく中央に配置された画鋲から飛び出すようにします。

今のところ、mapViewDidFinishLoadingMap:を監視してから、注釈を選択します。ただし、これには問題があります。たとえば、このメソッドは、追加のマップデータをロードする必要がない場合は呼び出されません。そのような場合、私の注釈は選択されていません。:(

結構。代わりに、中心座標を設定した直後にこれを呼び出すことができます。ああ、でもその場合、ロードするマップデータがある可能性があります(ただし、ロードはまだ完了していません)。アニメーションがせいぜいむらになるので、私はそれをあまりにも早く呼び出す危険があります。

したがって、私が正しく理解していれば、私の座標が表示されているかどうかを知ることは問題ではありません。画面一杯の距離を迷い、新しい地図データをロードする必要があるからです。むしろ、新しい地図データをロードする必要があるかどうかを知り、それに応じて行動することが重要です。

これを実現する方法、または注釈が存在する座標上でマップビューを再中心化した後、注釈を(確実に)選択する方法についてのアイデアはありますか?

手がかりを高く評価しました-ありがとう!

4

7 に答える 7

36

私は同じ問題に遭遇しましたが、信頼できる合理的な解決策のように見えるものを見つけました:

  1. デリゲートメソッドmapView:didAddAnnotationViews:を実装します。デリゲートメソッド内で直接アノテーションを選択しようとすると、ピンでコールアウトがドロップしました!それは奇妙に見えたので、0.5秒のわずかな遅延を追加します。

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. 期待どおりに最初のアノテーションを選択しますが、selectAnnotation:animated;を呼び出します。

    -(void)selectInitialAnnotation {
        [self.mapView selectAnnotation:self.initialAnnotation animated:YES];
    }
    

selectAnnotation:animated:条件によっては呼び出されないようです。MKMapViewドキュメントと比較してください:

指定された注釈が画面に表示されていないため、関連付けられた注釈ビューがない場合、このメソッドは効果がありません。

于 2010-02-16T00:06:42.900 に答える
7

固定タイムアウトを使用するよりも一貫した方法は、regionDidChangeコールバックをリッスンすることです。マップの中心座標を目的の注釈に設定し、regionDidChangeメソッドが呼び出されたら、中央の注釈を選択して、コールアウトを開きます。

これは私が5つのピンの間でランダムに走っているものについて撮った小さなビデオです。

まず、注釈の中心座標に移動します。注釈オブジェクトの名前がであるとしましょうthePin

- (void)someMethod {
    [map setCenterCoordinate:thePin.coordinate animated:YES];
}

次に、regionDidChangeメソッドでこのアノテーションを選択します。

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
于 2010-11-12T05:23:13.800 に答える
5

参考までに、これはドキュメントが言っていることです、

指定された注釈が画面に表示されていないため、関連付けられた注釈ビューがない場合、このメソッドは効果がありません。

したがって、setCenterCoordinate:animated:またはを呼び出しsetRegion:animated:てから、を呼び出して注釈を選択したい場合、selectAnnotation:animated:注釈は選択されず、ドキュメントで前述したのとまったく同じ理由で呼び出しが表示されません。のようなものがあるのは素晴らしいsetCenterCoordinate:animated:ComletionBlockですが、そこにはありません..!私のために働いた方法は以下の通りです、

 [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseInOut animations:^{
        [self.mapView setCenterCoordinate:location.coordinate animated:YES];
    } completion:^(BOOL finished) {
        [self.mapView selectAnnotation:location animated:YES];
    }];

これにより、完了ブロックが得られ、それを使用して注釈を選択できます。

于 2013-08-14T05:43:10.747 に答える
4

私にとってうまくいったのは、メソッドselectAnnotation:animated:からの呼び出しでした。mapView:didAddAnnotationViews:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
{
    [mapView selectAnnotation:[[mapView annotations] lastObject] animated:YES];
}

同じことに関するAppleのドキュメントはここにあります。

マップ上に注釈が1つしかない[[mapView annotations] lastObject]ため、目的には問題がなかったことに注意してください。あなたのマイレージは異なる場合があります。

于 2009-11-02T18:44:18.460 に答える
2

私も同様の問題を抱えていました。私はanimatesDrop:YESでデフォルトのMKPinAnnotationViewを使用していました。MKMapViewに注釈を追加した後、これを実行していました。

[mapView selectAnnotation:[mapView.annotations objectAtIndex:1] animated:YES]

私のプログラムのロジックでは、最も近い注釈を選択する必要があります。これは機能していませんでした。理由を理解しました。ピンドロップアニメーションのため、この選択呼び出しの時点で注釈ビューが画面に表示されていませんでした。だから私がしたのは、1秒後に注釈を選択するためのタイマーを設定することだけでした。これはハックですが、機能します。ただし、たとえば3Gと3Gの場合など、すべての状況で機能するかどうかはわかりません。それを入れるための正しいコールバック関数を見つけたほうがいいでしょう。

selectTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self
               selector:@selector(selectClosestAnnotation) userInfo:nil
               repeats:NO];

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}
于 2009-12-15T17:49:23.100 に答える
1

私は自分の問題に対して見たすべての解決策でいくつかの問題を見つけました(viewDidAppearから注釈を追加したときに注釈を選択したい):

  1. mapView:didAddAnnotationViews:デリゲートメソッドを使用します。

    指定された注釈が画面に表示されておらず、したがって関連付けられた注釈ビューがない場合、このメソッドは効果がないため、これは機能しませんでした。

  2. mapViewDidFinishLoadingMap:デリゲートメソッドを使用します。

    マップが現在キャッシュされているため、これも機能しませんでした。そのため、メソッドは最初に1回だけ呼び出されます。

解決:

ジョン・ブラックバーンは非常に近かったが、mapView:didAddAnnotationViews:方法がなかった。selectAnnotation:アノテーションを追加する前に、遅延を伴って独自のメソッドを呼び出すだけです。

[self.mapView addAnnotation:ann];
[self performSelector:@selector(selectAnnotation:) withObject:ann afterDelay:0.5];

そして、これは私が私のselectAnnotation:方法で行うことです:

- (void)selectAnnotation:(id < MKAnnotation >)annotation
{
   [self.mapView selectAnnotation:annotation animated:YES];
}

2台のiPhone3GS(iOS 5および6)とiPhone5でテスト済み。

于 2012-10-23T08:31:08.510 に答える
0

私も同様の問題を抱えていましたが、一貫性がないことは言うまでもなく、実際にはこの方法をまったく機能させることができませんでした。

これが私がうまくいくとわかったものです。多分それはあなたのためにも働くでしょう: ピンに触れることなくMKAnnotationViewのコールアウトビューをトリガーする方法は?

于 2009-08-24T02:53:40.583 に答える