MKMapView に複数の注釈を設定しています。ピンがクリックされたときにマップ注釈の吹き出しを使用する代わりに、代わりにサブビュー ( self.detailView
) を画面の下部にアニメーション化し、何も選択されていないときにそれを元に戻したいと考えています。ユーザーがピンを選択してから別のピンを選択すると、ビューが画面外でアニメーション化され、すぐに画面上でアニメーション化されます (もちろん、新しく選択された注釈に対応するさまざまな情報があります)。
あまり考えずに、簡単にできると思われることを試してみました。注釈が選択されself.detailView
ている場合は画面上でアニメーション化され、選択が解除されている場合はself.detailView
画面外でアニメーション化されます。
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
NSLog( @"selected annotation view" );
[UIView animateWithDuration:0.2f
delay:0.0f
options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
animations:^{
[self.detailView setFrame:CGRectMake(0, 307, 320, 60)];
}
completion:^(BOOL finished){
}];
}
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
NSLog( @"deselected annotation view" );
[UIView animateWithDuration:0.2f
delay:0.0f
options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
animations:^{
[self.detailView setFrame:CGRectMake(0, 367, 320, 60)];
}
completion:^(BOOL finished){
}];
}
これは、ピンが選択されていないときにユーザーがピンを選択した場合、およびピンが選択されていて、ユーザーが空のスペースをクリックして選択を解除した場合に正常に機能します。もちろん、ピンが既に選択されている場合に問題が発生します。ユーザーが別のピンをクリックして立て続けに起動するdidDeselectAnnotationView
とdidSelectAnnotationView
、両方のアニメーションが同時に実行され、その結果、効果が適切に機能しません。 . 通常、最初のアニメーションの完了ブロックに 2 番目のアニメーションを配置して、アニメーションを連鎖させますが、それらは別々のメソッドにあるため、ここでは明らかにそれを行うことはできません。
この問題をどのように回避できるかについて、誰かアイデアはありますか? ありがとう!