当我缩放 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 以显示我的注释时,选定的注释部分不在屏幕上的主要内容,如果未能解决你的问题,请参考以下文章

MapView 以用户坐标为中心缩放

从 MapView 中删除多个注释

Swift MapKit - MapView 中不显示注释

如何自动缩放mapView以显示覆盖

Iphone mapview 中未显示多个注释

地图缩放时,别针上的弹出框不移动