我知道用于在加载地图并添加注释和叠加层时告知我的委托方法。 (mapViewDidFinishLoadingMap:
mapView:didAddAnnotationViews:
mapView:didAddOverlayViews:
)
我希望在所有内容都加载后从UIImage
创建MKMapView
。目前我在调用UIImage
后创建mapView:didAddOverlayViews:
,但这并不总是可靠的,因为有时候叠加需要更长的时间才能添加,有时mapViewDidFinishLoadingMap:
被调用多次或需要很长一段时间加载。有时它不会被调用因为缓存了瓷砖。因此,很难确切知道什么时候加载了。我尝试过使用计时器,但这也不能让它变得可靠。
我的问题是,如何知道所有内容何时完全加载,包括所有地图图块,所有注释和所有叠加层?
答案 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,但即使它发生得太早。
所以看起来只有一种方式存在 - 等待几秒钟满载并交叉手指希望加载地图已经完成。