iOS:加载MKMapView并添加注释/叠加层时的通知?

时间:2011-12-07 18:48:15

标签: objective-c ios cocoa-touch mkmapview mapkit

我知道用于在加载地图并添加注释和叠加层时告知我的委托方法。 (mapViewDidFinishLoadingMap: mapView:didAddAnnotationViews: mapView:didAddOverlayViews:

我希望在所有内容都加载后从UIImage创建MKMapView。目前我在调用UIImage后创建mapView:didAddOverlayViews:,但这并不总是可靠的,因为有时候叠加需要更长的时间才能添加,有时mapViewDidFinishLoadingMap:被调用多次或需要很长一段时间加载。有时它不会被调用因为缓存了瓷砖。因此,很难确切知道什么时候加载了。我尝试过使用计时器,但这也不能让它变得可靠。

我的问题是,如何知道所有内容何时完全加载,包括所有地图图块,所有注释和所有叠加层?

6 个答案:

答案 0 :(得分:22)

这是一个老问题,但如果您使用的是iOS 7,请使用mapView mapViewDidFinishRenderingMap委托。

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
{
    // Image creation code here

}

答案 1 :(得分:4)

以下代码适用于Swift 1.2中的iOS 8.4

func mapViewDidFinishRenderingMap(mapView: MKMapView!, fullyRendered: Bool) {
    // Your code on rednering completion
}

答案 2 :(得分:1)

mapViewDidFinishRenderingMap的问题在于,它只包含地图图块本身的加载,而不包括图块和注释。为此,您可以使用didAddAnnotationViews。为了安全起见,我建议观察两者,并使用哪些以后再返回。

答案 3 :(得分:0)

好吧,你可以在你的委托中设置三个标志:

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
    didFinishLoadingMap = YES;
    [self createImage];
}

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
    didFinishAddingAnnotationViews = YES;
    [self createImage];
}

- (void)mapView:(MKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews

{
    didFinishAddingOverlayViews = YES;
    [self createImage];
}

......然后

- (void)createImage
{
    if (didFinishLoadingMap && didFinishLoadingAnnotationViews && didFinishAddingOverlayViews) {
        // Create the image
    }
}

...然后在NO方法中将所有三个标志设置回mapViewWillStartLoadingMap:。在缓存地图图块的情况下,这可能会创建一个比必要更频繁的图像,但是新的叠加层和新注释都会滚动到屏幕上 - 如果您想要防范它,可以使用UIPanGestureRecognizer来检测当用户平移或捏住地图时,相应地将这两个标志重置为NO

答案 4 :(得分:0)

如果您将注意力从“地图视图”中移开,这相对容易。我一下子绘制的东西就是将我的所有请求全部放入。我存储了“请求”的总数,当他们完成加载功能时,我检查了“如果请求离开== 0”或类似,那么我称之为“在之后绘制所有内容”。

所以你要做的是让3个单独的类型添加到“运行总计”(因为队列本身在Comp Sci中是不同的,试图避免词汇冲突),然后当它们“用完”时,通过拥有他们的“绘制矩形”调用或“init with coder”如果它是一个Xib注释或者你可以保证的任何函数,因为iOS UIView子类绝对没有像所有其他编程语言一样的常见初始化函数(单独的rant),基本上init调用一个函数一个公共类,单例,静态int,委托,无论哪个,然后看它何时耗尽 - 。

我意识到你的项目已经结束了,但是有这么多的赞成,认为答案不会受到影响。如果Objective C有一个构造函数,这个答案就会简单得多。无论哪种方式,这应该解决它,只需要一些思考和时间,因为它是关于如何实现它的每个项目。

答案 5 :(得分:0)

我已经尝试过其他答案。

至少对于iOS 11.1,它似乎无法获得完全加载的时间

我从VKMapView对象中找到了未记录的通知VKMapViewDidBecomeFullyDrawnNotification,但即使它发生得太早。

所以看起来只有一种方式存在 - 等待几秒钟满载并交叉手指希望加载地图已经完成。