MKMapView 不呈现(仅当来自背景时)
MKMapView not rendering (just when coming from background)
我正在创建一个没有故事板的 MKMapView
。那是我的 ViewController
class(setupLayout
在 viewDidLoad
上调用)和我的 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
进行设置。
我正在创建一个没有故事板的 MKMapView
。那是我的 ViewController
class(setupLayout
在 viewDidLoad
上调用)和我的 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
进行设置。