iOS: Notification when MKMapView is loaded and annotations/overlays are added?

我只是一个虾纸丫 提交于 2019-12-31 18:42:29

问题


I am aware of the delegate methods used to let me know when the map has loaded and annotations and overlays have been added. (mapViewDidFinishLoadingMap: mapView:didAddAnnotationViews: mapView:didAddOverlayViews:)

I am wanting to create a UIImage from my MKMapView once everything has loaded. Currently I am creating my UIImage once mapView:didAddOverlayViews: is called, but this is not always reliable, because sometimes the overlay take longer to be added, sometimes mapViewDidFinishLoadingMap: is called more than once or it takes a long time to load. Sometimes it is NOT called because tiles are cached. So, it is very hard to know exactly when everything has loaded. I have tried using a timer but that doesn't make it reliable either.

My question is, how can I know when everything has completely loaded, including all map tiles, all annotations and all overlays?


回答1:


It's an old question, but if you're using iOS 7 just use the mapView mapViewDidFinishRenderingMap delegate.

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

}



回答2:


The following code works on iOS 8.4 in Swift 1.2

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



回答3:


The problem with mapViewDidFinishRenderingMap is that is only includes the loading of the map tiles themselves, not the tiles plus the annotations. For this, you can use didAddAnnotationViews. To be safe, I would recommend observing both, and using which ever returns later.




回答4:


Well, you could set three flags in your delegate:

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

...and then

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

...and then set all three flags back to NO in your mapViewWillStartLoadingMap: method. This might create an image slightly more often than necessary, in the scenario where map tiles are cached but both new overlays and new annotations scroll onto the screen – if you wanted to guard against that, you could use a UIPanGestureRecognizer to detect when the user pans or pinches the map, and reset those two flags to NO accordingly.




回答5:


This is relatively easy if you get your mind out of the "map view". What I did with graphing something all at once was to put all my Requests into a total. I stored the total number of "requests" and when they finished their loading function, I had a check of "if requests left == 0" or similar, then I called the "Draw everything after".

So what you'd do is make the 3 separate types add to a "running total" (since a queue itself is different in Comp Sci, trying to avoid vocabulary conflict), then when they "run out", via having their "Draw rect" call or "init with coder" if it's a Xib annotation or whatever function you can guarantee since iOS UIView subclasses have absolutely no common initialization function like every other programming language (separate rant), basically that init calls a function on a common class, singleton, static int, delegate, whichever, and then see when it-runs out-.

I realize your project ended, but with so many upvotes, figured an answer wouldn't hurt. This answer would be much simpler if Objective C had a constructor. Either way, this should solve it, just takes some thought and time, as it's per-project on exactly how to implement it.




回答6:


I have tried all ways from other answers.

It looks like impossible to get the time when it was fully loaded at least for iOS 11.1

I have found undocumented notification VKMapViewDidBecomeFullyDrawnNotification from VKMapView object but even it happens too early.

So it looks like only one way exist - wait couple seconds for full load and cross fingers to hope load the map was done.



来源:https://stackoverflow.com/questions/8420764/ios-notification-when-mkmapview-is-loaded-and-annotations-overlays-are-added

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!