使用 Mapbox 和 SwiftUI 制作空白地图
Blank Map with Mapbox and SwiftUI
我尝试将 Mapbox 与 SwiftUI 结合使用。
我应用了这个答案 and also followed the mapbox tutorial。
所以我有一个 MapView.swift 视图:
import SwiftUI
import Mapbox
extension MGLPointAnnotation {
convenience init(title: String, coordinate: CLLocationCoordinate2D) {
self.init()
self.title = title
self.coordinate = coordinate
}
}
struct MapView: UIViewRepresentable {
@Binding var annotations: [MGLPointAnnotation]
private let mapView: MGLMapView = MGLMapView(frame: .zero, styleURL: MGLStyle.streetsStyleURL)
// MARK: - Configuring UIViewRepresentable protocol
func makeUIView(context: UIViewRepresentableContext<MapView>) -> MGLMapView {
mapView.delegate = context.coordinator
return mapView
}
func updateUIView(_ uiView: MGLMapView, context: UIViewRepresentableContext<MapView>) {
updateAnnotations()
}
func makeCoordinator() -> MapView.Coordinator {
Coordinator(self)
}
// MARK: - Configuring MGLMapView
func styleURL(_ styleURL: URL) -> MapView {
mapView.styleURL = styleURL
return self
}
func centerCoordinate(_ centerCoordinate: CLLocationCoordinate2D) -> MapView {
mapView.centerCoordinate = centerCoordinate
return self
}
func zoomLevel(_ zoomLevel: Double) -> MapView {
mapView.zoomLevel = zoomLevel
return self
}
private func updateAnnotations() {
if let currentAnnotations = mapView.annotations {
mapView.removeAnnotations(currentAnnotations)
}
mapView.addAnnotations(annotations)
}
// MARK: - Implementing MGLMapViewDelegate
final class Coordinator: NSObject, MGLMapViewDelegate {
var control: MapView
init(_ control: MapView) {
self.control = control
}
func mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle) {
let coordinates = [
CLLocationCoordinate2D(latitude: 37.791329, longitude: -122.396906),
CLLocationCoordinate2D(latitude: 37.791591, longitude: -122.396566),
CLLocationCoordinate2D(latitude: 37.791147, longitude: -122.396009),
CLLocationCoordinate2D(latitude: 37.790883, longitude: -122.396349),
CLLocationCoordinate2D(latitude: 37.791329, longitude: -122.396906),
]
let buildingFeature = MGLPolygonFeature(coordinates: coordinates, count: 5)
let shapeSource = MGLShapeSource(identifier: "buildingSource", features: [buildingFeature], options: nil)
mapView.style?.addSource(shapeSource)
let fillLayer = MGLFillStyleLayer(identifier: "buildingFillLayer", source: shapeSource)
fillLayer.fillColor = NSExpression(forConstantValue: UIColor.blue)
fillLayer.fillOpacity = NSExpression(forConstantValue: 0.5)
mapView.style?.addLayer(fillLayer)
}
func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
return nil
}
func mapView(_ mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool {
return true
}
}
}
和我的 ContentView.swift 调用 MapView:
import SwiftUI
import Mapbox
struct ContentView: View {
@State var annotations: [MGLPointAnnotation] = [
MGLPointAnnotation(title: "Mapbox", coordinate: .init(latitude: 37.791434, longitude: -122.396267))
]
var body: some View {
MapView(annotations: $annotations).centerCoordinate(.init(latitude: 37.791293, longitude: -122.396324)).zoomLevel(16)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我还使用我的 mapbox 帐户获得的 mapbox 令牌创建了一个 ~/.mapbox 文件。但是我有一张空白地图:
当我下载 运行 mapbox example 时,它工作正常,所以我认为这不是我的 Xcode 版本的问题。有谁知道为什么我自己创建项目时无法加载地图?
Xcode版本:11.3
Mapbox 版本:5.3.0
您需要在 Info.plist 中设置您的 MGLMapboxAccessToken
。
我不知道我是否应该为此创建一个新的请求,但我遇到了同样的问题,而且我在 Info.plist
中也有 MGLMapboxAccessToken
(由@andrewcar 提议)。
就我而言,当应用程序被发送到后台然后再发送到前台时,我遇到了这个问题。
我通过在 UIApplication.didBecomeActiveNotification
通知中添加观察者并执行不可察觉的缩放更改来修复它:
在viewDidLoad
我补充说:
let becomeActiveNotification = NotificationCenter.default
becomeActiveNotification.addObserver(self, selector: #selector(didBecomeActiveNotification), name: UIApplication.didBecomeActiveNotification, object: nil)
然后我这样实现了didBecomeActiveNotification
:
@objc func didBecomeActiveNotification() {
self.mapView.setZoomLevel(14, animated: false)
self.mapView.setZoomLevel(15, animated: false) // 15 is my desired zoom level
}
我希望它对某人有所帮助,我几乎无法找到我的问题的答案。
我尝试将 Mapbox 与 SwiftUI 结合使用。
我应用了这个答案
所以我有一个 MapView.swift 视图:
import SwiftUI
import Mapbox
extension MGLPointAnnotation {
convenience init(title: String, coordinate: CLLocationCoordinate2D) {
self.init()
self.title = title
self.coordinate = coordinate
}
}
struct MapView: UIViewRepresentable {
@Binding var annotations: [MGLPointAnnotation]
private let mapView: MGLMapView = MGLMapView(frame: .zero, styleURL: MGLStyle.streetsStyleURL)
// MARK: - Configuring UIViewRepresentable protocol
func makeUIView(context: UIViewRepresentableContext<MapView>) -> MGLMapView {
mapView.delegate = context.coordinator
return mapView
}
func updateUIView(_ uiView: MGLMapView, context: UIViewRepresentableContext<MapView>) {
updateAnnotations()
}
func makeCoordinator() -> MapView.Coordinator {
Coordinator(self)
}
// MARK: - Configuring MGLMapView
func styleURL(_ styleURL: URL) -> MapView {
mapView.styleURL = styleURL
return self
}
func centerCoordinate(_ centerCoordinate: CLLocationCoordinate2D) -> MapView {
mapView.centerCoordinate = centerCoordinate
return self
}
func zoomLevel(_ zoomLevel: Double) -> MapView {
mapView.zoomLevel = zoomLevel
return self
}
private func updateAnnotations() {
if let currentAnnotations = mapView.annotations {
mapView.removeAnnotations(currentAnnotations)
}
mapView.addAnnotations(annotations)
}
// MARK: - Implementing MGLMapViewDelegate
final class Coordinator: NSObject, MGLMapViewDelegate {
var control: MapView
init(_ control: MapView) {
self.control = control
}
func mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle) {
let coordinates = [
CLLocationCoordinate2D(latitude: 37.791329, longitude: -122.396906),
CLLocationCoordinate2D(latitude: 37.791591, longitude: -122.396566),
CLLocationCoordinate2D(latitude: 37.791147, longitude: -122.396009),
CLLocationCoordinate2D(latitude: 37.790883, longitude: -122.396349),
CLLocationCoordinate2D(latitude: 37.791329, longitude: -122.396906),
]
let buildingFeature = MGLPolygonFeature(coordinates: coordinates, count: 5)
let shapeSource = MGLShapeSource(identifier: "buildingSource", features: [buildingFeature], options: nil)
mapView.style?.addSource(shapeSource)
let fillLayer = MGLFillStyleLayer(identifier: "buildingFillLayer", source: shapeSource)
fillLayer.fillColor = NSExpression(forConstantValue: UIColor.blue)
fillLayer.fillOpacity = NSExpression(forConstantValue: 0.5)
mapView.style?.addLayer(fillLayer)
}
func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
return nil
}
func mapView(_ mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool {
return true
}
}
}
和我的 ContentView.swift 调用 MapView:
import SwiftUI
import Mapbox
struct ContentView: View {
@State var annotations: [MGLPointAnnotation] = [
MGLPointAnnotation(title: "Mapbox", coordinate: .init(latitude: 37.791434, longitude: -122.396267))
]
var body: some View {
MapView(annotations: $annotations).centerCoordinate(.init(latitude: 37.791293, longitude: -122.396324)).zoomLevel(16)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我还使用我的 mapbox 帐户获得的 mapbox 令牌创建了一个 ~/.mapbox 文件。但是我有一张空白地图:
当我下载 运行 mapbox example 时,它工作正常,所以我认为这不是我的 Xcode 版本的问题。有谁知道为什么我自己创建项目时无法加载地图?
Xcode版本:11.3
Mapbox 版本:5.3.0
您需要在 Info.plist 中设置您的 MGLMapboxAccessToken
。
我不知道我是否应该为此创建一个新的请求,但我遇到了同样的问题,而且我在 Info.plist
中也有 MGLMapboxAccessToken
(由@andrewcar 提议)。
就我而言,当应用程序被发送到后台然后再发送到前台时,我遇到了这个问题。
我通过在 UIApplication.didBecomeActiveNotification
通知中添加观察者并执行不可察觉的缩放更改来修复它:
在viewDidLoad
我补充说:
let becomeActiveNotification = NotificationCenter.default
becomeActiveNotification.addObserver(self, selector: #selector(didBecomeActiveNotification), name: UIApplication.didBecomeActiveNotification, object: nil)
然后我这样实现了didBecomeActiveNotification
:
@objc func didBecomeActiveNotification() {
self.mapView.setZoomLevel(14, animated: false)
self.mapView.setZoomLevel(15, animated: false) // 15 is my desired zoom level
}
我希望它对某人有所帮助,我几乎无法找到我的问题的答案。