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

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

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

我的问题是,我怎么知道什么时候一切都已完全加载,包括所有地图图块,所有注释和所有叠加?

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

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

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

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

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

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

 - (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 } } 

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

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

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

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

我从其他答案中尝试了各种方法。

至少在iOS 11.1中,它似乎不可能获得完全加载的时间

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

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