Подтвердить что ты не робот

IOS: уведомление о загрузке MKMapView и добавление аннотаций/наложений?

Мне известны методы делегата, которые позволяют мне знать, когда карта загружена, добавлены аннотации и оверлеи. (mapViewDidFinishLoadingMap: mapView:didAddAnnotationViews: mapView:didAddOverlayViews:)

Я хочу создать UIImage из моего MKMapView, как только все будет загружено. В настоящее время я создаю свой UIImage один раз, когда вызывается mapView:didAddOverlayViews:, но это не всегда надежно, потому что иногда наложение занимает больше времени, а иногда mapViewDidFinishLoadingMap: вызывается более одного раза или требуется много времени для загрузки. Иногда он НЕ вызывается, потому что плитки кешируются. Поэтому очень точно знать, когда все загрузилось. Я попытался использовать таймер, но это не делает его надежным.

Мой вопрос: как я могу узнать, когда все полностью загружено, включая все плитки карт, все аннотации и все оверлеи?

4b9b3361

Ответ 1

Это старый вопрос, но если вы используете iOS 7, просто используйте делегат mapView mapViewDidFinishRenderingMap.

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

}

Ответ 2

Следующий код работает на iOS 8.4 в Swift 1.2

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

Ответ 3

Проблема с mapViewDidFinishRenderingMap заключается в том, что она включает только загрузку самих фрагментов карты, а не фрагментов плюс аннотации. Для этого вы можете использовать didAddAnnotationViews. Чтобы быть в безопасности, я бы рекомендовал наблюдать и то, и другое, что когда-либо будет позже.

Ответ 4

Ну, вы можете установить три флага в своем делетете:

- (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 для обнаружения, когда пользователь нажимает или зажимает карту, а reset те два флага на NO соответственно.

Ответ 5

Это относительно легко, если вы выберете свой ум из "вида карты". То, что я сделал с графическим отображением чего-то сразу, заключалось в том, чтобы поместить все мои запросы в общую сумму. Я сохранил общее количество "запросов", и когда они закончили свою функцию загрузки, у меня была проверка "если запросы остались == 0" или аналогичные, тогда я назвал "Нарисовать все после".

Итак, что бы вы сделали, это сделать 3 отдельных типа добавлением к "текущей сумме" (так как сама очередь в Comp Sci отличается от других, пытается избежать конфликта с лексикой), а затем, когда они "заканчиваются", их вызов "Прямой прямой" или "init ccoder", если это аннотация Xib или любая функция, которую вы можете гарантировать, поскольку подклассы iOS UIView не имеют абсолютно никакой общей функции инициализации, как и любой другой язык программирования (отдельный rant), в основном, что init вызывает функцию на общий класс, singleton, static int, делегат, в зависимости от того, что вы увидите, а затем увидите, когда он закончится -.

Я понимаю, что ваш проект закончился, но с таким количеством опросов, как я понял, ответ не повредит. Этот ответ был бы намного проще, если бы у Objective C был конструктор. В любом случае, это должно решить его, просто задумывается и время, поскольку оно предназначено для реализации именно того, как его реализовать.

Ответ 6

Я пробовал все пути от других ответов.

Похоже, что невозможно получить время, когда оно было полностью загружено, по крайней мере, для iOS 11.1

Я нашел недокументированное уведомление VKMapViewDidBecomeFullyDrawnNotification из объекта VKMapView, но даже это происходит слишком рано.

Итак, похоже, что существует только один способ - подождать пару секунд для полной загрузки и перекрестия пальцев, чтобы надеяться загрузить карту.