Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SwiftUI地图显示注释_Ios_Swift_Swiftui_Xcode12_Ios14 - Fatal编程技术网

Ios 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

我决定从将MKMapView包装到UIViewRepresentable中切换到SwiftUI中新的
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)
    }
  }
}