MKMapView 不呈现(仅当来自背景时)

MKMapView not rendering (just when coming from background)

我正在创建一个没有故事板的 MKMapView。那是我的 ViewController class(setupLayoutviewDidLoad 上调用)和我的 MapViewController class:

// MARK: - View Controller Lifecycle
extension ViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setupInterface()
    }

}

// MARK: - Interface
extension ViewController: Interface {

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

Class 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()
        }
    }

}

未调用委托方法且地图未正确呈现:

如果我再次进入背景和前景,地图会按预期工作。有什么问题可能出在哪里吗?

updateViewConstraints方法中调用makeConstraints怎么样?

override func setupLayout() {
    super.setupLayout()

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

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

问题在于初始化:它需要发生在 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()
    }
}

viewDidLoad 初始化或设置地图不足以解决我的问题:我最终不得不在 viewWillAppear 进行设置。