Ios SwiftUI地图显示注释
我决定从将MKMapView包装到UIViewRepresentable中切换到SwiftUI中新的Ios SwiftUI地图显示注释,ios,swift,swiftui,xcode12,ios14,Ios,Swift,Swiftui,Xcode12,Ios14,我决定从将MKMapView包装到UIViewRepresentable中切换到SwiftUI中新的Map() 我能够在Map()中正确显示MKMapRect,但是我无法在那里显示两个MKPointAnnotation。我在这些注释之间的路线也没有显示 它要求我提供一个RandomAccessCollection和一个(可识别)->MapAnnotationProtocol>,但我不知道该放什么 知道我应该在(可识别)->MapAnnotationProtocol中添加什么吗 import Sw
Map()
我能够在Map()
中正确显示MKMapRect
,但是我无法在那里显示两个MKPointAnnotation
。我在这些注释之间的路线也没有显示
它要求我提供一个RandomAccessCollection
和一个(可识别)->MapAnnotationProtocol>
,但我不知道该放什么
知道我应该在(可识别)->MapAnnotationProtocol
中添加什么吗
import SwiftUI
import MapKit
extension MKPointAnnotation: Identifiable { }
struct ItemView: View {
@ObservedObject var itemViewModel: ItemViewModel
@State var coll = [MKPointAnnotation]()
func onAppear() {
let requestAnnotation = MKPointAnnotation()
requestAnnotation.coordinate = CLLocationCoordinate2D(latitude: 46.2004781, longitude: 6.1346497)
requestAnnotation.title = "Package"
let destinationAnnotation = MKPointAnnotation()
destinationAnnotation.coordinate = CLLocationCoordinate2D(latitude: 47.1420446, longitude: 9.5204032)
destinationAnnotation.title = "Destination"
coll.append(requestAnnotation)
coll.append(destinationAnnotation)
}
var body: some View {
VStack {
if let mapRect = itemViewModel.route?.polyline.boundingMapRect {
Map(mapRect: .constant(mapRect), annotationItems: coll) { point in
MapAnnotation(coordinate: point.coordinate) {
Text(point.title ?? "")
}
}
}
}
.onAppear(perform: self.onAppear)
}
}
它应该如下所示(由于提供的快照中缺少依赖项,因此未进行测试)
您不再需要执行
MKPointAnnotation
。目前,在Xcode 12.0 Beta版中,SwiftUI提供了三种结构来满足MapAnnotationProtocol
:
MapAnnotation
MapMarker
MapPin
RandomAccessCollection
应该是采用可识别
的对象的任何集合(一个数组就可以了)。这些参数用作Map
初始值设定项的最后一个参数中的块参数
Map(coordinateRegion: $container.region,
annotationItems: container.annotationLocations) {
(location) -> MapPin in
MapPin(coordinate: location.coordinate)
})
在我看来,
MapAnnotation
要求您实现将在地图上渲染的整个视图,因此,如果您想要红色pin和一些文本,您必须自己创建该pin(例如,作为带有SF符号的图像实例)。当然,它看起来不像MapMarker
中的pin那样好,但至少它是一个开始
Map(coordinateRegion: .constant(mapRect), annotationItems: coll) { annotationItem in
MapAnnotation(coordinate: annotationItem.coordinate) {
VStack {
Group {
Image(systemName: "mappin.circle.fill")
.resizable()
.frame(width: 30.0, height: 30.0)
Circle()
.frame(width: 8.0, height: 8.0)
}
.foregroundColor(.red)
Text(annotationItem.title)
}
}
}
代码编译得很好,但我看不到红色的注释,知道我在这里仍然做错了什么吗?我还用硬编码坐标更新了我的问题以进行测试。路线呢?有没有可能在SwiftUI上做呢?我不知道。我希望他们能发布一个关于新地图功能的视频,但我想我们还没有得到。我们将在接下来的几次测试中看到它是否得到了充实……你能用MapAnnotation做一个例子吗。我还需要显示一些文本,这就是为什么我需要MapAnnotation
Map(coordinateRegion: .constant(mapRect), annotationItems: coll) { annotationItem in
MapAnnotation(coordinate: annotationItem.coordinate) {
VStack {
Group {
Image(systemName: "mappin.circle.fill")
.resizable()
.frame(width: 30.0, height: 30.0)
Circle()
.frame(width: 8.0, height: 8.0)
}
.foregroundColor(.red)
Text(annotationItem.title)
}
}
}