我想在一个MKMapView动画后调用一个新的MKMapCamera。
我首先使用以下方法附加MKMapCamera:
[self.map setCamera:cam animated:YES];此方法导致动画,但没有通知我什么时候动画完成。然后,在看到UIView动画块之后,我尝试通过使用回调方法来实现这个方法,所以帖子
MKMapCamera *cam = [[MKMapCamera alloc] init];
cam.pitch = 75;
cam.altitude = 125;
[cam setCenterCoordinate:self.location.coordinate];
[UIView animateWithDuration:3.0f animations:^{
self.map.camera = cam;
} completion:^(BOOL finished) {
[self methodToImplement];
}];MKMapView仍然是动画的,但是methodToImplement同时被调用。
谢谢!
发布于 2014-02-12 11:13:54
在这种情况下,完成处理程序似乎无法正常工作,因此您需要使用MKMapViewDelegate方法来处理region确实发生了更改。请参阅WWDC 2013 -透视地图套件
好,现在我启动这个动画到下一个摄像机,我需要知道什么时候动画完成,这样我就可以动画到我们堆栈中的下一个摄像机。 在这里,您可能会考虑使用完成处理程序,但是它会让您绊倒。 我知道会的。 不要使用那个完成处理程序。 相反,您需要使用MKMapViews委托方法,该方法告诉您何时完成区域更改。
如果您不打算使用许多不同类型的动画,那么您可以只使用mapView:RegionDidChange动画: method并检查动画标志来调用您的“methodToImplement”(动画标志只适用于由于动画调用而引起的区域更改,而不是像拖动地图那样的用户输入)。
在我自己的项目中,我有一个更复杂的流,所以我需要一个更灵活的解决方案,所以我选择在我的视图控制器中添加一个NSMutableArray of NSBlockOperation对象作为包含MKMapView的属性。对应于某个块的每个块操作都是我们不能使用的完成处理程序。在mapView:RegionDidChange动画中:我只是一个一个地弹出操作并执行它们:
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
if (animated) {
dispatch_async(dispatch_get_main_queue(), ^{
while (self.mapRegionAnimationBlocks.count > 0) {
NSBlockOperation* op = [self.mapRegionAnimationBlocks firstObject];
[self.mapRegionAnimationBlocks removeObjectAtIndex:0];
[op start];
}
});
});在任何时候我想要为该块使用完成处理程序的地方,我只需在调用动画代码之前添加到该数组中:
dispatch_async(dispatch_get_main_queue(), ^{
NSBlockOperation* op = [NSBlockOperation blockOperationWithBlock:^{
[self methodToImplement];
}];
[self.mapRegionAnimationBlocks addObject:op];
});
[UIView animateWithDuration:3.0f animations:^{
self.map.camera = cam;
} completion:NULL];请注意,只从单个线程(例如主线程)使用NSMutableArray很重要,因为它不是线程安全的。
我的解决方案有点麻烦,可能应该被包装在MKMapView的一个类别或子类中,但我还没有解决这个问题。
发布于 2014-01-25 16:17:42
如果您设置了地图视图的委托,那么您可以编写一个mapViewDidFinishLoadingMap:,它“告诉指定的映射视图成功加载了所需的地图数据”。
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
// do whatever you want
}如果您不仅希望知道何时加载映射数据,而且也想知道地图的呈现何时完成(在iOS7+中),则可以使用mapViewDidFinishRenderingMap,它“告诉委托映射视图已完成所有可见块的呈现”。
- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
{
// do whatever you want
}有关更多信息,请参见MKMapViewDelegate协议参考。
https://stackoverflow.com/questions/20929042
复制相似问题