首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动画到新MKMapCamera后的回调

动画到新MKMapCamera后的回调
EN

Stack Overflow用户
提问于 2014-01-05 01:41:44
回答 2查看 1.8K关注 0票数 2

我想在一个MKMapView动画后调用一个新的MKMapCamera

我首先使用以下方法附加MKMapCamera

代码语言:javascript
复制
    [self.map setCamera:cam animated:YES];

此方法导致动画,但没有通知我什么时候动画完成。然后,在看到UIView动画块之后,我尝试通过使用回调方法来实现这个方法,所以帖子

代码语言:javascript
复制
    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同时被调用。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-12 11:13:54

在这种情况下,完成处理程序似乎无法正常工作,因此您需要使用MKMapViewDelegate方法来处理region确实发生了更改。请参阅WWDC 2013 -透视地图套件

好,现在我启动这个动画到下一个摄像机,我需要知道什么时候动画完成,这样我就可以动画到我们堆栈中的下一个摄像机。 在这里,您可能会考虑使用完成处理程序,但是它会让您绊倒。 我知道会的。 不要使用那个完成处理程序。 相反,您需要使用MKMapViews委托方法,该方法告诉您何时完成区域更改。

如果您不打算使用许多不同类型的动画,那么您可以只使用mapView:RegionDidChange动画: method并检查动画标志来调用您的“methodToImplement”(动画标志只适用于由于动画调用而引起的区域更改,而不是像拖动地图那样的用户输入)。

在我自己的项目中,我有一个更复杂的流,所以我需要一个更灵活的解决方案,所以我选择在我的视图控制器中添加一个NSMutableArray of NSBlockOperation对象作为包含MKMapView的属性。对应于某个块的每个块操作都是我们不能使用的完成处理程序。在mapView:RegionDidChange动画中:我只是一个一个地弹出操作并执行它们:

代码语言:javascript
复制
- (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];
            }
        });
    });

在任何时候我想要为该块使用完成处理程序的地方,我只需在调用动画代码之前添加到该数组中:

代码语言:javascript
复制
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的一个类别或子类中,但我还没有解决这个问题。

票数 2
EN

Stack Overflow用户

发布于 2014-01-25 16:17:42

如果您设置了地图视图的委托,那么您可以编写一个mapViewDidFinishLoadingMap:,它“告诉指定的映射视图成功加载了所需的地图数据”。

代码语言:javascript
复制
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
    // do whatever you want
}

如果您不仅希望知道何时加载映射数据,而且也想知道地图的呈现何时完成(在iOS7+中),则可以使用mapViewDidFinishRenderingMap,它“告诉委托映射视图已完成所有可见块的呈现”。

代码语言:javascript
复制
- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
{        
    // do whatever you want
}

有关更多信息,请参见MKMapViewDelegate协议参考

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20929042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档