iphone - MKMapView setRegion animated 不显示动画

标签 iphone ios objective-c mkmapview

我有一个 MKMapViewannotation pins。加载 View 时,会搜索最近的图钉, map 将缩放,以便同时显示用户的位置和最近的图钉。我用 [map setRegion:region animated:YES]; 来做到这一点。到这里为止一切正常。还可以通过点击定位用户的按钮来调用相同的方法,然后执行我刚才描述的操作。

我还有一个搜索字段,用户可以使用它来搜索 map 点。当用户点击其中一个搜索结果时, map 会设置区域,以便搜索到的图钉位于中间。 现在,这有点奇怪。我还设置了这个区域动画,至少我执行了与上面相同的命令。但是,如果 map 点距离 map 当前可见部分太远,则在更改区域时不会显示动画。 我错过了什么吗?我已经看过 Apples 文档,他们没有提及任何关于动画最大距离的内容。

我期待任何帮助!


更新 1:
刚刚在模拟器中再次测试了它。一个有趣的事实是,当我第一次搜索 MapPoint 然后选择一个搜索结果时,它没有动画。如果我在第一个搜索之后执行另一个搜索并选择一个结果,它就会动画化。一旦我点击定位按钮,将用户带回他的位置和最近的点,它就不会为这个 setRegion: 和之后的第一次搜索设置动画。但仅在模拟器中,在我的 4S 上,它完全符合我在上面的原始问题中描述的内容。


更新 2:
在评论中,我被要求提供示例坐标。
所以这里是第一步的坐标(搜索自己的位置和最近的引脚):
我的位置: 47.227131/8.264251
最近的引脚: 47.251347/8.357191
它们之间的距离约为22公里。 map 的中心是两个图钉之间的中心。从中心到屏幕边界的距离是两点之间距离的 1.5 倍,在这种情况下大约是 33 公里。
这是第二步的一组坐标(搜索 map 点并选择它):
搜索到的密码: 46.790680/9.818824
此处到屏幕边界的距离固定为 500 米。

最佳答案

我已经在 iOS 6 和 iOS 7 beta 上用一个简单的演示应用程序测试了这个问题。事实证明, map View 实际上并不总是为区域之间的过渡设置动画。这取决于区域之间的距离。例如,从巴黎到伦敦的过渡不是动画。但是,如果您先缩小一点然后转到伦敦,它将是动画的。

文档说:

animated: Specify YES if you want the map view to animate the transition to the new region or NO if you want the map to center on the specified region immediately.

但是正如我们所见,我们不能依赖动画。我们只能告诉 map View 转换应该是动画的。 MapKit 决定动画是否合适。它告诉委托(delegate)人是否将在 -(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 中设置动画。

为了在所有情况下始终对区域变化进行动画处理,您需要先对中间区域进行动画处理。令 A 为当前 map 区域,B 为目标区域。如果区域之间有交集,您可以直接过渡。 (将 MKCoordinateRegion 转换为 MKMapRect 并使用 MKMapRectIntersection 找到交点)。如果没有交集,则计算一个跨越两个区域的区域 C(使用 MKMapRectUnionMKCoordinateRegionForMapRect)。然后先去 C 区,在 regionDidChangeAnimated 里去 B 区。

示例代码:

MKCoordinateRegion region = _destinationRegion;    
MKMapRect rect = MKMapRectForCoordinateRegion(_destinationRegion);
MKMapRect intersection = MKMapRectIntersection(rect, _mapView.visibleMapRect);
if (MKMapRectIsNull(intersection)) {
    rect = MKMapRectUnion(rect, _mapView.visibleMapRect);
    region = MKCoordinateRegionForMapRect(rect);
    _intermediateAnimation = YES;
}
[_mapView setRegion:region animated:YES];

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    if (_intermediateAnimation) {
        _intermediateAnimation = NO;
        [_mapView setRegion:_destinationRegion animated:YES];
    }
}

此辅助方法取自 here

MKMapRect MKMapRectForCoordinateRegion(MKCoordinateRegion region)
{
    MKMapPoint a = MKMapPointForCoordinate(CLLocationCoordinate2DMake(
                                                                      region.center.latitude + region.span.latitudeDelta / 2,
                                                                      region.center.longitude - region.span.longitudeDelta / 2));
    MKMapPoint b = MKMapPointForCoordinate(CLLocationCoordinate2DMake(
                                                                      region.center.latitude - region.span.latitudeDelta / 2,
                                                                      region.center.longitude + region.span.longitudeDelta / 2));
    return MKMapRectMake(MIN(a.x,b.x), MIN(a.y,b.y), ABS(a.x-b.x), ABS(a.y-b.y));
}

WWDC 2013 session 309 透视 Map Kit 解释了如何在 iOS 7 中进行此类复杂的转换。

关于iphone - MKMapView setRegion animated 不显示动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041119/

相关文章:

c++ - Cocoa 和 Objective-C++

objective-c - 通过OSX Cron运行时,Objective C命令失败

iphone - 如何在 View 中显示加载动画 - IOS

html - CSS 图像 Sprite 无法在 iPhone/iPad 上正确显示

ios - 如何缩放 CAShapeLayer

ios - 如何显示单词的结果?

iphone - XCode:如何以编程方式获取用户的电子邮件?

ios - 如何使用从 AVCaptureDevice 捕获的 NSData 和 NSDictionary 组合一个面向 "right"的 UIImage?

ios - 如何禁用 webView 中的弹出窗口?

ios - 将点击手势添加到 tableview 使得放置在表头 View 中的 UICollectionView 单元格不可选择