当我执行以下代码段时,地图会正确缩放以包含所有注释,但是标注部分在屏幕外。解决这个问题最优雅的方法是什么?
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)
}
答案 0 :(得分:0)
如果我理解正确,那么我就有同样的问题。我不确定这是否是最“优雅”的解决方案,但简单的延迟对我来说是个窍门。你可以尝试类似的东西,如:
//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秒的任意时间;这可能比你需要的更多或更少 - 如果你真的想要(我很懒),你可以根据你必须放大的距离来确定这个数字;或者,更加聪明,并找出如何缩放时间。
享受!
答案 1 :(得分:0)
我有这个确切的问题,我尝试了@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];
}];
}
}
}