SwiftUI 中的Marker方法,用于在地图上显示一个标记点,并允许通过闭包提供自定义的内容视图(View)。
Marker 的初始化方法覆盖了多种常见的标记场景,从简单的文本标记到自定义内容的标记。
初始化方法及其适用场景
1、完全自定义内容
public init(coordinate: CLLocationCoordinate2D, @ViewBuilder label: () -> Label)
用途: 允许你通过一个闭包提供自定义的 SwiftUI 视图作为标记内容。
示例:
Marker(coordinate: CLLocationCoordinate2D(latitude: 51.501, longitude: -0.141)) {
Image(systemName: "paperplane.fill")
}
适用场景: 当需要完全定制标记内容时,比如自定义图标、复杂视图等。
2、文本标记 (Localized Key)
public init(_ titleKey: LocalizedStringKey, coordinate: CLLocationCoordinate2D)
用途: 使用一个本地化的字符串作为标记的标题,显示在默认气泡中。
示例:
Marker("My Location", coordinate: CLLocationCoordinate2D(latitude: 51.501, longitude: -0.141))
适用场景: 当标记的内容只是简单的标题文本。
3、文本标记 (普通字符串)
public init<S>(_ title: S, coordinate: CLLocationCoordinate2D) where S: StringProtocol
用途: 类似于上面的本地化版本,但直接使用普通字符串。
示例:
Marker("Simple Text", coordinate: CLLocationCoordinate2D(latitude: 51.501, longitude: -0.141))
适用场景: 当不需要本地化字符串时。
4、文本和短字符标记 (Monogram)
public init(_ titleKey: LocalizedStringKey, monogram: Text, coordinate: CLLocationCoordinate2D)
public init<S>(_ title: S, monogram: Text, coordinate: CLLocationCoordinate2D) where S : StringProtocol
用途: 在标记的气泡图标中显示短字符(最多 3 个),同时提供标题。
示例:
Marker("Palace", monogram: Text("BP"), coordinate: CLLocationCoordinate2D(latitude: 51.501, longitude: -0.141))
适用场景: 想在标记的图标中显示缩写或简短字符。
5、文本和系统图标标记
public init(_ titleKey: LocalizedStringKey, systemImage: String, coordinate: CLLocationCoordinate2D)
public init<S>(_ title: S, systemImage: String, coordinate: CLLocationCoordinate2D) where S : StringProtocol
用途: 使用 SF Symbols 图标作为标记的气泡图标,同时提供标题。
示例:
Marker("Tower", systemImage: "building.columns", coordinate: CLLocationCoordinate2D(latitude: 51.508, longitude: -0.076))
适用场景: 想用系统图标作为标记图标时。
6、文本和图片标记
public init(_ titleKey: LocalizedStringKey, image: String, coordinate: CLLocationCoordinate2D)
public init<S>(_ title: S, image: String, coordinate: CLLocationCoordinate2D) where S : StringProtocol
用途: 使用本地图片作为标记的气泡图标,同时提供标题。
示例:
Marker("Custom Image", image: "custom-icon", coordinate: CLLocationCoordinate2D(latitude: 51.501, longitude: -0.141))
适用场景: 想使用自定义图片资源作为标记图标时。
Image在实际测试过程中是空白的,即使是使用32 * 32小尺寸照片:
7、使用 MapKit 提供的默认标记
public init(item: MKMapItem) where Label == Text
用途: 直接使用一个 MKMapItem 对象来生成标记,MKMapItem 会自动提供相关信息(如名称)。
示例:
let mapItem = MKMapItem(placemark: MKPlacemark(coordinate: CLLocationCoordinate2D(latitude: 51.501, longitude: -0.141)))
Marker(item: mapItem)
适用场景: 当已有一个 MKMapItem 对象时。
总结
简单场景: 用带文本标题的初始化方法(如 Marker(“Title”, coordinate:))。
图标场景: 用带 systemImage 或 image 的方法。
自定义场景: 用 Marker(coordinate:content:) 自定义内容。
MapKit 集成: 用 Marker(item:)。
选择合适的初始化方法取决于标记内容需求和地图交互复杂度。
相关文章
SwiftUI地图标记点Annotation:https://fangjunyu.com/2024/11/22/swiftui%e5%9c%b0%e5%9b%be%e6%a0%87%e8%ae%b0%e7%82%b9annotation/