使用 MKMapKit 显示用户位置 (Objective C)
Show User Location with MKMapKit (Objective C)
我目前正在学习使用 iOS 的 MKMapKit 框架,但找不到任何好的教程,因为其中大部分都在 Swift(我还没有学过的语言)或只是太老了,不相关。所以我想知道你们是否可以回答一些关于显示用户位置和权限的具体问题。
我的代码目前是最基本的,我有一个 MKMapView 初始化,它工作得很好:
@interface ViewController () <MKMapViewDelegate>
...
mapView.frame = CGRectMake(0, 0, windowSize.width, windowSize.height);
mapView.delegate = self;
mapView.showsUserLocation = YES;
[self.view addSubview:mapView];
以及放大地图上特定位置的方法:
- (void)setLocation:(CLLocationCoordinate2D)location {
float perimeter = 250.0f;
[mapView setRegion:MKCoordinateRegionMakeWithDistance(location, perimeter, perimeter) animated:YES];
}
这显示了我从 Google 地图中获得的坐标的预定位置。这一切都很好,但现在我想在我的应用程序中添加一个按钮来定位用户的当前位置并放大它。但这就是我迷路的地方。我找不到任何好的教程可以清楚地向我解释如何使用 Obj C 实现这一点。一些人谈论 CLCoreLocation 及其代表,一些人说它只适用于 MKMapKit,但到目前为止没有任何效果。
此外,我在请求使用 phone 的 GPS 的权限时遇到问题。我已将以下行添加到 info.plist 文件中:
Privacy - Location When In Use Usage Description
我还添加了一个字符串作为其值,但似乎无法触发弹出窗口 window 以允许我访问 GPS。在一次尝试中,window 出现了一秒钟,然后立即消失了。所以,我也很茫然。
基本上这是我想要实现的目标:
- 在应用程序首次启动时或用户点击当前位置按钮时请求使用 GPS 的权限(以防他或她错误地拒绝该权限)。
- 如果有权限,应用程序应该默认放大用户的位置,或者如果没有授予权限,则放大到预定位置(这最后一部分现在有效)。
- 应用不应跟随用户移动,而是保持静止,允许用户自由平移和缩放。但是,如果用户点击 "Current Location" 按钮,它应该像启动时一样放大他或她的位置。
谁能帮我解决这个问题,也许可以写几行来解释为什么事情会这样?目前没有 Objective C 的教程,所以我认为这对其他人也很有帮助。
一些附加信息:我使用 Xcode 9.3 并以编程方式执行所有操作(我不使用界面生成器)。
非常感谢!
1。请求位置更新
要请求位置更新,您需要一个 CLLocationManager。您需要将接收器 class 设置为 CLLocationManagerDelegate。
//Create location manager
locationManager = [[CLLocationManager alloc] init];
//Subscribe to location updates
[locationManager setDelegate:self];
//Request always authorization
[locationManager requestAlwaysAuthorization];
//Start location updates
[locationManager startUpdatingLocation];
//Start heading updates
[locationManager startUpdatingHeading];
//Receive all updates
locationManager.distanceFilter = kCLDistanceFilterNone;
//Get best possible accuracy
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
您的接收器class需要实施
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
class 的方法。您可以在此处检查您的应用程序是否已获得许可。如果status == kCLAuthorizationStatusDenied
,用户已经拒绝了你的请求。如果状态 == kCLAuthorizationStatusAuthorizedAlways
或 kCLAuthorizationStatusAuthorizedWhenInUse
,您可以检索用户的位置。然后您可以从位置管理器中检索位置。
locationManager.location
如果用户拒绝您的位置访问请求,您将无法在应用内再次请求。但是,您可以要求他们更改设置并使用 openURL:
调用将他们发送到您应用的隐私设置。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
2。移动到用户位置
将地图移动到用户位置非常简单。一行代码就可以搞定
[map setCenterCoordinate:map.userLocation.coordinate animated:YES];
3.
这已经是 MapKit 的默认行为。
我目前正在学习使用 iOS 的 MKMapKit 框架,但找不到任何好的教程,因为其中大部分都在 Swift(我还没有学过的语言)或只是太老了,不相关。所以我想知道你们是否可以回答一些关于显示用户位置和权限的具体问题。
我的代码目前是最基本的,我有一个 MKMapView 初始化,它工作得很好:
@interface ViewController () <MKMapViewDelegate>
...
mapView.frame = CGRectMake(0, 0, windowSize.width, windowSize.height);
mapView.delegate = self;
mapView.showsUserLocation = YES;
[self.view addSubview:mapView];
以及放大地图上特定位置的方法:
- (void)setLocation:(CLLocationCoordinate2D)location {
float perimeter = 250.0f;
[mapView setRegion:MKCoordinateRegionMakeWithDistance(location, perimeter, perimeter) animated:YES];
}
这显示了我从 Google 地图中获得的坐标的预定位置。这一切都很好,但现在我想在我的应用程序中添加一个按钮来定位用户的当前位置并放大它。但这就是我迷路的地方。我找不到任何好的教程可以清楚地向我解释如何使用 Obj C 实现这一点。一些人谈论 CLCoreLocation 及其代表,一些人说它只适用于 MKMapKit,但到目前为止没有任何效果。
此外,我在请求使用 phone 的 GPS 的权限时遇到问题。我已将以下行添加到 info.plist 文件中:
Privacy - Location When In Use Usage Description
我还添加了一个字符串作为其值,但似乎无法触发弹出窗口 window 以允许我访问 GPS。在一次尝试中,window 出现了一秒钟,然后立即消失了。所以,我也很茫然。
基本上这是我想要实现的目标:
- 在应用程序首次启动时或用户点击当前位置按钮时请求使用 GPS 的权限(以防他或她错误地拒绝该权限)。
- 如果有权限,应用程序应该默认放大用户的位置,或者如果没有授予权限,则放大到预定位置(这最后一部分现在有效)。
- 应用不应跟随用户移动,而是保持静止,允许用户自由平移和缩放。但是,如果用户点击 "Current Location" 按钮,它应该像启动时一样放大他或她的位置。
谁能帮我解决这个问题,也许可以写几行来解释为什么事情会这样?目前没有 Objective C 的教程,所以我认为这对其他人也很有帮助。
一些附加信息:我使用 Xcode 9.3 并以编程方式执行所有操作(我不使用界面生成器)。
非常感谢!
1。请求位置更新
要请求位置更新,您需要一个 CLLocationManager。您需要将接收器 class 设置为 CLLocationManagerDelegate。
//Create location manager
locationManager = [[CLLocationManager alloc] init];
//Subscribe to location updates
[locationManager setDelegate:self];
//Request always authorization
[locationManager requestAlwaysAuthorization];
//Start location updates
[locationManager startUpdatingLocation];
//Start heading updates
[locationManager startUpdatingHeading];
//Receive all updates
locationManager.distanceFilter = kCLDistanceFilterNone;
//Get best possible accuracy
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
您的接收器class需要实施
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
class 的方法。您可以在此处检查您的应用程序是否已获得许可。如果status == kCLAuthorizationStatusDenied
,用户已经拒绝了你的请求。如果状态 == kCLAuthorizationStatusAuthorizedAlways
或 kCLAuthorizationStatusAuthorizedWhenInUse
,您可以检索用户的位置。然后您可以从位置管理器中检索位置。
locationManager.location
如果用户拒绝您的位置访问请求,您将无法在应用内再次请求。但是,您可以要求他们更改设置并使用 openURL:
调用将他们发送到您应用的隐私设置。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
2。移动到用户位置
将地图移动到用户位置非常简单。一行代码就可以搞定
[map setCenterCoordinate:map.userLocation.coordinate animated:YES];
3.
这已经是 MapKit 的默认行为。