MKMapView не рендерится (только при переходе из фона) - PullRequest
0 голосов
/ 02 октября 2018

Я создаю MKMapView без раскадровки.Это мой ViewController класс (setupLayout вызывается на viewDidLoad) и мой MapViewController класс:

// MARK: - View Controller Lifecycle
extension ViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setupInterface()
    }

}

// MARK: - Interface
extension ViewController: Interface {

    func setupInterface() {
        setupDesign()
        setupStrings()
        setupBindings()
        setupLayout()
    }
}

Класс MapViewController:

class MapViewController: ViewController {

    internal var cars: [Car]?

    // MARK: Interface Properties
    private var mapView = MKMapView(frame: .zero)

    // MARK: Internal Functions
    internal override func updateCars(cars: [Car]) {
        self.cars = cars
        placeCars()
    }
}

// MARK: - Interface
extension MapViewController {

    // MARK: Strings
    override func setupStrings() {
        super.setupStrings()

        title = Strings.mapViewTitle.localized
    }

    // MARK: Bindings
    override func setupBindings() {
        super.setupBindings()

        mapView.delegate = self
        mapView.register(CarAnnotationView.self, forAnnotationViewWithReuseIdentifier: CarAnnotationView.reuseIdentifier)
        mapView.setRegion(MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: Constants.StartCoordinates.latitude, longitude: Constants.StartCoordinates.longitude), span: MKCoordinateSpan(latitudeDelta: Constants.StartCoordinates.latitudeDelta, longitudeDelta: Constants.StartCoordinates.longitudeDelta)), animated: true)

    }

    // MARK: Layout
    override func setupLayout() {
        super.setupLayout()

        view.addSubview(mapView)
        mapView.snp.makeConstraints { make in
            make.edges.equalToSuperview()
        }
    }

}

Методы делегатовне вызываются, и карта не отображается должным образом:

enter image description here

Если я снова перейду на задний план и на передний план, карта будет работать, как и ожидалось.Любые идеи, где проблема может быть заложена?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Проблема была в инициализации: это должно было произойти на viewDidLoad, а не на верхнем уровне контроллера.

class MapViewController: ViewController {

    private var mapView: MKMapView?

// ...

override func viewDidLoad() {
    super.viewDidLoad()

    setupMapView()
}

func setupMapView() {
    mapView = MKMapView(frame: .zero)
    mapView?.delegate = self
    mapView?.register(CarAnnotationView.self, forAnnotationViewWithReuseIdentifier: CarAnnotationView.reuseIdentifier)
    mapView?.setRegion(MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: Constants.StartCoordinates.latitude, longitude: Constants.StartCoordinates.longitude), span: MKCoordinateSpan(latitudeDelta: Constants.StartCoordinates.latitudeDelta, longitudeDelta: Constants.StartCoordinates.longitudeDelta)), animated: true)

    guard let mapView = mapView else { return }
    view.addSubview(mapView)
    mapView.snp.remakeConstraints { make in
        make.edges.equalToSuperview()
    }
}
0 голосов
/ 04 мая 2019

Инициализация или настройка карты на viewDidLoad была недостаточной для устранения проблемы, в моем случае: мне пришлось выполнить настройку в viewWillAppear.

0 голосов
/ 02 октября 2018

Как насчет вызова makeConstraints в updateViewConstraints методе?

override func setupLayout() {
    super.setupLayout()

    view.addSubview(mapView)
    view.setNeedsUpdateConstraints()
}

override func updateViewConstraints() {
    mapView.snp.makeConstraints { make in
        make.edges.equalToSuperview()
    }
}
...