В xcode 9 с iOS 11 - проблема с загрузкой картографических плит при первом запуске

- Обновлено с новыми результатами - Проверено как в симуляторе, так и на устройстве. Карты загружаются неправильно, когда приложение запускается с холодного запуска. Плитки не отображаются.

mapViewDidFinishLoadingMap не вызывается. Так что что-то не так, чтобы карта не закончилась, но я не получаю ошибок.

Карта загружается отлично, если я просто выхожу из приложения, а затем снова. Это означает, что карты загружаются, если приложение открыто из фона.

Любые идеи, что изменилось? Работала отлично в iOS 10.

enter image description here

Обновление

В iOS 11 mapViewWillStartLocatingUser вызывается, но не mapViewWillStartRenderingMap. Мне интересно, нужно ли мне вручную вызвать что-то, чтобы рендеринг с карты был запущен. В iOS 9 (что я тестировал, и было ли это просто отлично) mapViewWillStartRenderingMap вызывается до mapViewWillStartLocatingUser

Ответ 1

Думаю, вам стоит попробовать Удалив

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

}

и введя следующий код в метод View Didload

    CGFloat edge = 10.0f;

    UIImage *gotoUserLocationButtonImage = self.gotoUserLocationButton.imageView.image;
    self.gotoUserLocationButton.frame = CGRectMake(edge, edge + self.statusBarHeight, gotoUserLocationButtonImage.size.width, gotoUserLocationButtonImage.size.height);

    UIImage *getDirectionsButtonImage = self.getDirectionsButton.imageView.image;
    [self.getDirectionsButton setFrame:CGRectMake(CGRectGetMaxX(self.gotoUserLocationButton.frame), edge + self.statusBarHeight, getDirectionsButtonImage.size.width, getDirectionsButtonImage.size.height)];

Ответ 2

Убедитесь, что вы не используете dispatch_async для карты.

У меня была следующая функция, которая не работала в iOS11

dispatch_async(dispatch_get_main_queue(), ^{
    @synchronized(_queue) {
        if(poppedMapView != nil) {
            [self.queue removeObject:poppedMapView];
        }
        [self.queue addObject:[[MKMapView alloc] init]];
    }
});

Изменено на

if(poppedMapView != nil) {
    [self.queue removeObject:poppedMapView];
}
[self.queue addObject:[[MKMapView alloc] init]];

Ответ 3

У меня была точно такая же проблема, потратил много времени, чтобы найти решение, и, наконец, я это сделал. Так что в моем случае проблема была с неправильной инициализацией. Обычно вы должны писать let mapView = MKMapView() в верхней части viewController, а затем настроить его где-нибудь позже в viewDidLoad, но после IOS 11 Beta 1 он перестает работать. Я исправил его, изменив на var mapView: MKMapView? в верхней части viewController, а затем внутри viewDidLoad я инициализирую его как mapView = MKMapView(). Надеюсь, это поможет кому-то!:)

Ответ 4

С той же проблемой мой код BROKEN выглядел примерно так:

class ViewController: UIViewController {

    fileprivate var mapView = MKMapView()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Add the mapView to the VC
        mapView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(mapView)
        mapView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        mapView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        mapView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        mapView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    }
}

Как выяснилось в iOS 11, не нравится, когда инициализация MKMapView инициализируется до того, как контроллер загрузки загрузился, т.е. viewDidLoad(), поэтому FIX изменился на:

class ViewController: UIViewController {

    fileprivate var mapView: CSMapView?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Init instance here.
        mapView = CSMapView()

        // Add the mapView to the VC
        mapView?.translatesAutoresizingMaskIntoConstraints = false
        ...
    }
}

Также попробовал поместить его в методы init, но этот DID NOT не работал у меня:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    mapView = MKMapView()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    mapView = MKMapView()
}