当我缩放 mapView 以显示我的注释时,选定的注释部分不在屏幕上
Posted
技术标签:
【中文标题】当我缩放 mapView 以显示我的注释时,选定的注释部分不在屏幕上【英文标题】:When I zoom my mapView to show my annotations, the selected annotations are partially off screen 【发布时间】:2015-06-17 18:55:51 【问题描述】:当我执行以下代码 sn-p 时,地图会正确缩放以包含所有注释,但是标注部分位于屏幕外。解决这个问题的最优雅的方法是什么?
func mapView(mapView: MKMapView!, didAddAnnotationViews views: [AnyObject]!)
// once annotationView is added to the map, get the last one added unless it is the user's location:
if let annotationView = views.last as? MKAnnotationView where !(annotationView.annotation is MKUserLocation)
// show callout programmatically:
mapView.selectAnnotation(annotationView.annotation, animated: false)
// zoom to all annotations on the map:
mapView.showAnnotations(mapView.annotations, animated: true)
【问题讨论】:
【参考方案1】:如果我理解正确,那么我遇到了同样的问题。我不确定这是否是最“优雅”的解决方案,但一个简单的延迟对我来说就是诀窍。您可以尝试类似的方法,如下所示:
//Assuming this is how you center
mapView.setCenterCoordinate(annotation.coordinate, animated: true)
//Delaying the showing of annotation because otherwise the popover appears at "old" location before zoom finishes
let delayTime = dispatch_time(DISPATCH_TIME_NOW,Int64(0.75 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue())
mapView.selectAnnotation(annotationView.annotation, animated: false)
请注意,我使用了 0.75 秒的任意时间;这可能比你需要的多或少——如果你真的想要(我很懒),你可以根据你必须放大的距离来设定这个数字;或者,更加聪明,找出如何及时放大。
享受吧!
【讨论】:
谢谢。我最终选择了 UIEdgeInsets 的自定义函数。我想这两种方法都有点麻烦。【参考方案2】:我遇到了这个确切的问题,我尝试了 @Jona 的延迟方法,但我发现在某些设备上它可以工作,而在其他设备上却不行。这完全取决于设备设置/性能,因此使用延迟并不是最好的解决方案。
我的问题是,在我想要显示的特定图钉上打开标注视图(带动画)之前,我试图移动/缩放地图(带动画)。这样做会导致性能不佳,并且标注部分不在屏幕上。
我决定使用UIView animateWithDuration
方法,该方法有自己的完成块,因此不需要延迟。注意:使用UIView animateWithDuration
方法时,可以将animated
方法设置为NO
(或Swift中的false
)。因为UIView
动画块会为我们处理动画。
-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
// Loop through the pins on the
// map and find the added pin.
for (MKAnnotationView *annotationView in views)
// If the current pin is the
// added pin zoom in on it.
if (annotationView.annotation != mapView.userLocation)
// Set the map region to be
// close to the added pin.
MKCoordinateSpan span = MKCoordinateSpanMake(0.15, 0.15);
MKCoordinateRegion region = MKCoordinateRegionMake(annotationView.annotation.coordinate, span);
[mapView regionThatFits:region];
// Only perform the annotation popup
// when the animation has been completed.
[UIView animateWithDuration:0.4 delay:0.0 options:(UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionCurveEaseOut) animations:^
// Set the map region.
[mapView setRegion:region];
completion:^(BOOL finished)
// Force open the annotation popup.
[usersMap selectAnnotation:annotationView.annotation animated:YES];
];
【讨论】:
以上是关于当我缩放 mapView 以显示我的注释时,选定的注释部分不在屏幕上的主要内容,如果未能解决你的问题,请参考以下文章