募集中:MKMapView アノテーションを確実かつ一貫して選択する方法
-
12-09-2019 - |
質問
電話した後 MKMapViewさんの setCenterCo座標:アニメーション化: メソッド (アニメーションなし) を呼び出したいと思います selectAnnotation:アニメーション: (アニメーション付き) 新しく中央に配置されたプッシュピンから注釈が飛び出すようにします。
とりあえずはただ見守るだけです マップビュー完了ロード中マップ: そして注釈を選択します。しかし、これには問題があります。たとえば、追加のマップ データをロードする必要がない場合、このメソッドは呼び出されません。そのような場合、私の注釈は選択されません。 :(
非常によく。代わりに、中心座標を設定した後すぐにこれを呼び出すことができます。ああ、でもその場合、可能性はあります。 は ロードする地図データ (ただし、ロードはまだ完了していません)。アニメーションがせいぜいむらになってしまうので、あまりにも早すぎると判断する危険があります。
したがって、私の理解が正しければ、ほぼ 1 画面分の距離を逸脱する可能性があり、新しい地図データをロードする必要があるため、自分の座標が表示されているかどうかを知ることは問題ではありません。それよりも、 新しい地図データをロードする必要があるかどうかを知り、それに応じて行動することが重要です。
これを達成する方法、または注釈が存在する座標をマップ ビューの中心に再配置した後、注釈を別の方法で (確実に) 選択する方法について何かアイデアはありますか?
手がかりはありがたいです - ありがとう!
解決
私も同じ問題に遭遇しましたが、信頼性が高く合理的な解決策と思われるものを見つけました。
デリゲート メソッドmapView:didAddAnnotationViews:を実装します。デリゲート メソッド内で注釈を直接選択しようとすると、吹き出しがピンと一緒に落ちてしまいました。これは奇妙に思えたので、0.5 秒のわずかな遅延を追加します。
-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { [self performSelector:@selector(selectInitialAnnotation) withObject:nil afterDelay:0.5]; }
ご想像のとおり、最初のアノテーションを選択しますが、selectAnnotation:animated; を呼び出します。
-(void)selectInitialAnnotation { [self.mapView selectAnnotation:self.initialAnnotation animated:YES]; }
のようだ selectAnnotation:animated:
条件によっては呼び出されません。と比べて MKMapView ドキュメント:
指定された注釈が画面上にないため、関連する注釈図がない場合、この方法には効果がありません。
他のヒント
固定タイムアウトを使用するよりも一貫した方法は、 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];
}
参考までに、これがドキュメントに記載されていることです。
指定された注釈が画面上にないため、関連する注釈図がない場合、この方法には効果がありません。
それで、電話したい場合は 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];
}];
これにより完了ブロックが表示され、それを使用して注釈を選択できます。
私にとってうまくいったのは電話をかけることでした selectAnnotation:animated:
から mapView:didAddAnnotationViews:
方法:
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
{
[mapView selectAnnotation:[[mapView annotations] lastObject] animated:YES];
}
同じことに関する Apple のドキュメント ここ.
マップ上に注釈が 1 つしかないことに注意してください。 [[mapView annotations] lastObject]
私の目的には問題ありませんでした。あなたのマイレージは異なる場合があります。
私も同様の問題を抱えていました。私はanimatesDrop:YESでデフォルトのMKPinAnnotationViewを使用していました。MKMapView に注釈を追加した後、次のことを行っていました。
[mapView selectAnnotation:[mapView.annotations objectAtIndex:1] animated:YES]
私のプログラムのロジックでは、最も近いアノテーションを選択する必要があります。これは機能しませんでした。理由が分かりました:ピンドロップアニメーションのため、この選択呼び出しの時点では注釈ビューは画面上にありませんでした。そこで私がしたのは、1 秒後に注釈を選択するようにタイマーを設定することだけでした。これはハックですが、うまくいきます。ただし、たとえば 3G と 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];
}
私の問題に対して見たすべての解決策でいくつかの問題が見つかりました(viewDidAppearから注釈を追加するときに注釈を選択したいと考えています)。
を使用して、
mapView:didAddAnnotationViews:
デリゲートメソッド。指定された注釈が画面上にない場合、つまり関連付けられた注釈ビューがない場合、このメソッドは効果がないため、これは私にとっては機能しませんでした。
を使用して、
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 台の iPhone 3GS (iOS 5 および 6) と 1 台の iPhone 5 でテストしました。
私も同様の困難を抱えていましたが、実際にはこの方法をまったく機能させることができず、ましてや一貫性がありませんでした。
これが私がうまくいくことがわかったものです。もしかしたらあなたにもうまくいくかもしれません:ピンに触れずに MKAnnotationView の吹き出しビューをトリガーするにはどうすればよいですか?