Bug with Mapbox and SwiftUI
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bug with Mapbox and SwiftUI相关的知识,希望对你有一定的参考价值。
我尝试将Mapbox与SwiftUI结合使用。
我应用了此答案https://stackoverflow.com/a/56551675/5653544,也遵循了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
。
以上是关于Bug with Mapbox and SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章
Using Swift with Cocoa and Objective-C(Swift 2.0版):开始--基础设置-备
Using Swift with Cocoa and Objective-C--在同个project中使用Swift和在同个project中
Where is the bug and how is it fixed? an experiment with practitioner's
swift 报错 Call can throw, but it is not marked with 'try' and the error is not handled