我试图在选择注释后居中MKMapView
。我也启用了canShowCallout
但似乎iOS首先显示了标注(当它不适合屏幕时移动)然后地图被移动,导致标注不完全可见屏幕。
如何在呈现并显示标注的位置之前使地图居中?
答案 0 :(得分:3)
我想完成同样的事情,最后做了以下事情。
在我开始之前要小心谨慎:我知道解决方案非常难看!...但是,嘿,它有效。
注意:我的目标是iOS 9,但它应该适用于iOS的早期版本:
好的,我们走了:
@property(nonatomic, assign, getter=isPinCenteringOngoing) BOOL pinCenteringOngoing;
mapView:viewForAnnotation:
设置canShowCallout
到NO
以获取annotationViews 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];
});
});
}
为了完成我的回答,这里是对我在上面的代码中做了什么以及我为什么这样做的文字说明:
我希望我的回答可能有用。