MKMapView
注釈が選択された後、中央揃えにしようとしています。私も有効にcanShowCallout
しましたが、iOS が最初にコールアウトを表示し (画面に収まらない場合はシフトされます)、マップが移動されているようで、コールアウトが画面に完全に表示されていません。
吹き出しの位置がレンダリングおよび表示される前に、マップを中央に配置するにはどうすればよいですか?
MKMapView
注釈が選択された後、中央揃えにしようとしています。私も有効にcanShowCallout
しましたが、iOS が最初にコールアウトを表示し (画面に収まらない場合はシフトされます)、マップが移動されているようで、コールアウトが画面に完全に表示されていません。
吹き出しの位置がレンダリングおよび表示される前に、マップを中央に配置するにはどうすればよいですか?
私は同じことを達成したかったので、最終的に次のことを行いました。
始める前に注意事項があります。解決策がかなり醜いことはわかっています!...しかし、うまくいきます。
注: iOS 9 をターゲットにしていますが、以前のバージョンの iOS でも動作するはずです。
さて、ここに行きます:
@property(nonatomic, assign, getter=isPinCenteringOngoing) BOOL pinCenteringOngoing;
mapView:viewForAnnotation:
設定さcanShowCallout
れていますNO
でmapView:didSelectAnnotationView:
次のことを行います。
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
if([view isKindOfClass:$YOURANNOTATIONVIEWCLASS$.class])
{
if(!self.isPinCenteringOngoing)
{
self.pinCenteringOngoing = YES;
[self centerMapOnSelectedAnnotationView:($YOURANNOTATIONVIEWCLASS$ *)view];
}
else
{
self.pinCenteringOngoing = NO;
}
}
}
でmapView:didDeselectAnnotationView:
次のことを行います。
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
if([view isKindOfClass:$YOURANNOTATIONVIEWCLASS$.class])
{
if(!self.isPinCenteringOngoing)
{
view.canShowCallout = NO;
}
}
}
最後に、実際の作業を行う新しいメソッドを作成します。
- (void)centerMapOnSelectedAnnotationView:($YOURANNOTATIONVIEWCLASS$ *)view
{
// Center map
CGPoint annotationCenter = CGPointMake(CGRectGetMidX(view.frame), CGRectGetMidY(view.frame));
CLLocationCoordinate2D newCenter = [self.mapView convertPoint:annotationCenter toCoordinateFromView:view.superview];
[self.mapView setCenterCoordinate:newCenter animated:YES];
// Allow callout to be shown
view.canShowCallout = YES;
// Deselect and then select the annotation so the callout is actually displayed
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void)
{
[self.mapView deselectAnnotation:view.annotation animated:NO];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void)
{
[self.mapView selectAnnotation:view.annotation animated:NO];
});
});
}
私の答えを完成させるために、上記のコードで私が何をしているのか、そしてなぜそれをしているのかをテキストで説明します:
私の答えが役立つことを願っています。