用于选择位置的用户界面控制器。我写它是为了围绕自动位置检测提供一个简单的封装,但也可以在 GPS 不可用时提供手动位置选择。
在 截图文件夹 中有更多截图。
您需要找到存储库中的 MBPlacePickerController
子文件夹并将其添加到您的项目中。CocoaPods 支持是实验性的,使用以下行
pod 'MBPlacePickerController', '~>2.3.1'
MBPlacePickerController
是使用 iOS 7 SDK、ARC 和 Core Location 编写的 Objective-C。从 2.2.0 版本开始,MBPlacePickerController 需要 iOS 8 SDK,但与 iOS 7 兼容。(2.0.0 版本与 iOS 7 不兼容。早期和晚期的版本也是如此。)
MBPickerController
文件夹中的所有内容。其中包括 CRLCoreLib
、Place Picker
、Map View
和 Resources
等几个文件夹。将所有这些文件夹添加到您的项目中。
对于 iOS 8,您需要将以下键之一添加到您应用程序的 Info.plist 中。
如果您想 MBPlacePicker 请求“始终授权”权限,请将 NSLocationAlwaysUsageDescription
添加到您的 Info.plist 中。这与 iOS 7 的 kCLAuthorizationStatusAuthorized
行为相同。
如果您想 MBPlacePicker
请求“在应用时”权限,请在 Info.plist 中添加 NSLocationWhenInUseUsageDescription
键。
注意:如果您想在说明中使用应用程序的名称,请使用 ${PRODUCT_NAME},如下例所示
NSLocationWhenInUseUsageDescription | ${PRODUCT_NAME} 需要您的位置信息才能正确运行。
如果您想让位置选择器的缓存位置可供您的 App Extensions 查看,请将位置选择器的 defaultsSuiteName
属性设置为与您的应用程序组标识符相匹配。
要显示位置选择器,您需要遵循三个简单的步骤
// Step 0: Import the header.
#import "MBPlacePickerController.h"
// Step 1: Access the singleton picker
MBPlacePickerController *picker = [MBPlacePickerController sharedPicker];
// Step 2: Display the Picker
[picker display];
就这样!
当用户选择一个地点时,或当自动更新返回一个地点时,为地点选择器分配一个代理。您需要实现一个代理方法以捕获这些位置更新。假设您的代码类似于以下示例
picker.delegate = self; // Could be anything, really.
在您的代理中实现这个让人疯狂的方法,它会为您处理几乎所有的工作!
- (void)placePickerController:(MBPlacePickerController *)placePicker didChangeToPlace:(CLLocation *)place
{
// Do something with the location.
}
每次用户点击一个地点,或Core Location将一个位置返回给选择器时,此方法都会触发。
地点列表是我之前编写的东西。如果需要更改,您有两个选择。
您可以直接编辑位置列表。在Resources
文件夹中,有一个名为locations.json
的文件。
您可以通过在服务器上保持最新版本,以保持列表新鲜。设置选择器的serverURL
属性,告诉它在哪里查找。它将在调用其viewDidAppear
方法时更新。
无论哪种方式,您都需要遵循以下约定为每个地点
{
"name" : "Boston, Massachusetts, USA", // City name
"longitude" : -71.0597732, // Longitude
"latitude" : 42.3584308, // Latitude
"continent" : "North America" // Continent
}
如果您不提供正确首字母大写的洲名,洲排序将会出错。有效的洲可以是任何字符串,但您应该使用这些
"North America"
"Central America"
"South America"
"Africa"
"Asia"
"Europe"
"Antarctica"
注意:您不需要创建单例选择器,但如果您想在使用它从应用程序的各个部分获取连续的位置更新或使用缓存的位置时保持一致性,最好使用单例。
如果您不喜欢这样做,只需调用alloc] init]
即可。
这些都是为了您娱乐和愉悦存在的一些小玩意。
要获取自动位置更新,请调用选择器的enableAutomaticUpdates
。注意,如果用户选择一个位置,将调用disableAutomaticUpdates
,如果需要它们,您必须重新启用自动更新。您可以直接调用disableAutomaticUpdates
。
[picker enableAutomaticUpdates];
这相当于禁用自动更新
[picker disableAutomaticUpdates];
要自定义地图显示手动选择位置时使用的标记颜色,设置选择器地图视图的markerColor
属性。(自动位置标记始终是紫色。)
picker.map.markerColor = [UIColor orangeColor]; // Sets the marker to Orange.
要自定义地图显示手动选择位置时使用的标记大小,设置markerDiameter
属性。
picker.map.markerDiameter = 30.0f; // Sets the marker to 30.0f. (30 is default size.)
地图视图有一个切换来显示用户位置(即使位置是手动的)。用户的位置用一个紫色圆圈表示。
picker.map.showUserLocation = YES; // Enables user location.
2.2.0版本中包含免费搜索。您可以通过设置MBPlacePickerController
对象的showSearch
属性来开启或关闭搜索功能。默认值是YES
。
此处源代码遵照MIT许可证发布。请参阅LICENSE获取详细信息。
感谢Randall Munroe,因为如果不是他的XKCD #977,我可能还在互联网上搜索Plate Carrée地图投影。这就是像素与经纬度点一一对应的那种。我之前看过这个视频,但在这之后再次观看,看到xkcd让我笑得前仰后合。
我使用的地图图像来自Wikipedia,根据Wikipedia的说法,它属于公共领域。
应用程序图标中使用的图像是来自《The Noun Project》的“箭头”(作者:Alexander Smith)。(虽然他们让我写下这一点,但我很乐意分享好作品。)