使用地圖控件
新建項(xiàng)目,在StoryBoard中拖入一個(gè)MapKit View
直接運(yùn)行出吹,會(huì)報(bào)錯(cuò)
'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named MKMapView'
原因:沒(méi)有導(dǎo)入MapKit框架
點(diǎn)擊項(xiàng)目->General->Targets->Linked Framework and Libraries
加入 MapKit.framework
框架的榛,運(yùn)行成功
MapKit默認(rèn)使用高德地圖
顯示用戶的位置
顯示用戶的信息糊啡,需要設(shè)置追蹤模式
三種追蹤模式:
typedef NS_ENUM(NSInteger, MKUserTrackingMode) {
MKUserTrackingModeNone = 0, // 不追蹤
MKUserTrackingModeFollow, // 追蹤
MKUserTrackingModeFollowWithHeading, // 追蹤位置和方向
} NS_ENUM_AVAILABLE(NA, 5_0);
viewController.m
#import "ViewController.h"
#import <MapKit/MapKit.h>
@interface ViewController () <MKMapViewDelegate>
// 地圖
@property (weak, nonatomic) IBOutlet MKMapView *mapKit;
// 這個(gè)屬性主要用來(lái)請(qǐng)求權(quán)限
@property (strong, nonatomic) CLLocationManager *mgr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 設(shè)置追蹤模式
self.mapKit.userTrackingMode = MKUserTrackingModeFollow;
// 請(qǐng)求權(quán)限
// 這個(gè)方法是ios8推出的泣懊,ios7沒(méi)有這個(gè)方法嚷辅,在ios7上執(zhí)行這個(gè)方法會(huì)出錯(cuò)咕痛!
// 通過(guò)檢查是否存在這個(gè)方法就可以判斷是ios7還是ios8
if ([self.mgr respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.mgr requestAlwaysAuthorization];
}
}
#pragma mark - 懶加載
- (CLLocationManager *)mgr {
if (_mgr == nil) {
_mgr = [[CLLocationManager alloc] init];
}
return _mgr;
}
@end
運(yùn)行痢甘,會(huì)出現(xiàn)以下提示:
Trying to start MapKit location updates without prompting for location authorization. Must call [CLLocationManager requestWhenInUseAuthorization] or [CLLocationManager requestAlwaysAuthorization] first.
原因:ios8訪問(wèn)用戶的位置信息,需要用戶的授權(quán)茉贡。
在info.plist中塞栅,添加一個(gè)字段NSLocationAlwaysUsageDescription
,它的值就是請(qǐng)求授權(quán)時(shí)候的描述信息腔丧,可以設(shè)置也可以為空放椰。
當(dāng)程序請(qǐng)求用戶授權(quán)時(shí),會(huì)顯示的相應(yīng)的描述信息愉粤。
點(diǎn)擊允許砾医,就開(kāi)始定位了!
顯示位置信息
設(shè)置代理衣厘,實(shí)現(xiàn)代理方法
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
// 反地理編碼如蚜;根據(jù)經(jīng)緯度查找地名
[geocoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray *placemarks, NSError *error) {
if (placemarks.count == 0 || error) {
NSLog(@"找不到該位置");
return;
}
// 當(dāng)前地標(biāo)
CLPlacemark *pm = [placemarks firstObject];
// 區(qū)域名稱
userLocation.title = pm.locality;
// 詳細(xì)名稱
userLocation.subtitle = pm.name;
}];
}