MapItemPicker 🗺️📍

GithubCI_Status FiveSheep_Badge LICENSE_BADGE

MapItemPicker 是一个简单但高度可定制且功能强大的 SwiftUI 位置选择器。

Sheet for New York City Search for Airport in Germany Sheet for Central Park Picker Inside a Full Screen Overlay

描述

许多应用程序都需要某种视图来查找和选择位置。遗憾的是,Apple 没有在其框架中提供此类视图,并且 Maps 应用程序中显示的许多信息(这些信息使得搜索和发现地图项目变得容易)在 MKMapItem 上并未公开。MapItemPicker 使用来自 MapKit、OpenStreetMaps 和 Wikidata 的数据,提供一个简单、美观且全面的地图项目选择器。

示例代码

简单选择器

便捷方法

.mapItemPickerSheet(isPresented: $showsSheet) { mapItem in
    print("Map Item:", mapItem)
}

可定制视图

.fullScreenCover(isPresented: $showsSheet) {
    NavigationView {
        MapItemPicker(
            primaryMapItemAction: .init(
                title: "select",
                imageName: "checkmark.circle.fill",
                handler: { mapItem in
                    print("Map Item:", mapItem)
                    return true
                }
            )
        )
        .toolbar {
            ToolbarItem(placement: .navigationBarLeading) {
                Button("cancel") {
                    showsSheet = false
                }
            }
        }
        .navigationTitle(Text("select"))
        .navigationBarTitleDisplayMode(.inline)
        .toolbarBackground(.visible, for: .navigationBar)
    }
}

带有配置标准视图的高级地图视图

MapItemPicker(
    annotations: [MKPointAnnotation.chicago],
    annotationView: { annotation in
        MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: nil)
    },
    annotationSelectionHandler: { annotation in
        print("selected:", annotation)
    },
    overlays: [MKPolyline.newYorkToLosAngeles],
    overlayRenderer: { overlay in
        MKPolylineRenderer(polyline: overlay as! MKPolyline, color: .red)
    },
    primaryMapItemAction: .init(title: "select", imageName: "checkmark.circle.fill", handler: { mapItem in
        print("Map Item:", mapItem)
        return true
    }),
    additionalMapItemActions: [
        .init(
            title: "addTo",
            imageName: "plus.square",
            subActions: [
                .init(title: "Collection A", imageName: "square.on.square", handler: { mapItem in return false }),
                .init(title: "Collection B", imageName: "square.on.square", handler: { mapItem in return false })
            ]
        )
    ],
    showsLocationButton: false,
    additionalTopRightButtons: [
        .init(
            imageName: "magnifyingglass",
            handler: { searchControllerShown = true }
        )
    ],
    initialRegion: MKCoordinateRegion.unitedStates,
    standardView: { Text("Standard View") },
    searchControllerShown: $searchControllerShown,
    standardSearchView: { Text("Search View") }
)

本地化

MapItemPicker 包含类别、视图中各部分标题和其他字符串的本地化。目前,仅支持英语和德语。如果您能提供任何其他语言的本地化,请提交 PR。您可以从 Sources/MapItemPicker/Resources/en.lproj 中的英文 Localizable.strings 文件复制字符串。本地化键不多,您可能在 5 分钟内完成。

待办事项 (TODO)