1.定位
- CoreLocation: 用於地理定位
- 該框架中所有數據類型的前綴都是 CL
- 位置管理類 : CoreLocationManager
- Map Kit: 用於地圖顯示
2.個熱門專業術語
- LBS: Location Based Service
SoloMo: Social Local Mobile(索羅門)
- 10.26-12.1號,蘋果的定位在真機和模擬器都不能用
- 模擬器 bug, 定位時不打印,切換模擬器就可以了
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
3.經緯度coordinate
- latitude 緯度
- longitude 經度
- course 方向
在某些特殊情況下需要開啓永久定位授權
需要判斷版本信息
if ([UIDevice currentDevice].systemVersion.floatValue >= 9.0){ //配置 plist--如果未配置,就會崩潰 manager.allowsBackgroundLocationUpdates = YES; }
4.計算兩點間距離
- 直線距離
- distanceFromLocation: 返回結果是 double 類型
5.地理編碼和反地理編碼
地理編碼
- 將地址翻譯成經緯度
- CLGeocoder geocodeAddressString:
- 獲取 CLPlacemark
- name 具體地名
- locatity 城市名
- location 位置
- coordinate 經緯度
- 獲取 CLPlacemark
反地理編碼
- 將經緯度翻譯成地址
- CLGeocoder reverseGeocodeAddressString:
6. 導入框架問題
- 在 Xcode5之後,系統會默認幫你導入你需要的框架
- 原理是,根據你導入的頭文件自動導入對應的框架
- 如果在 storyboard 中添加第三方框架中的控件(除了 UIKit的框架)時,必須要手動導入框架,否則會崩潰,例如添加了 MapKit
7.地圖
iOS9新特性
- 實時交通
- mapView.showsTraffic = YES
- 實時交通
地圖類型 mapType
- 標準 standard
- 衛星 satellite
- 鳥瞰 HyBrid
用戶跟蹤模式
- mapView.userTrackingMode
- MKUserTrackingModeNone
- MKUserTrackingModeFollow 跟蹤
- MKUserTrackingModeFollowWithHeading 跟蹤位置和方向
- 在設置跟蹤模式之前要先
獲取授權
//1.獲取授權 CLLocationManager *manager = [[CLLocationManager alloc] init]; self.manager = manager; [manager requestWhenInUseAuthorization]; //2.設置跟蹤模式 self.mapView.userTrackingMode = MKUserTrackingModeFollow;
- mapView.userTrackingMode
回到用戶當前位置
- 確定中心點經緯度
確定經緯度跨度
事例
//返回到我的當前位置
- (IBAction)goBack:(id)sender {
self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
//經緯度跨度+中心點 = 區域
// region 中包含兩個結構體: 1.中心點結構體 2.經緯度跨度結構體
//1.設置經緯度跨度
MKCoordinateSpan span = MKCoordinateSpanMake(0.2, 0.2);
//不使用動畫
//self.mapView.region = MKCoordinateRegionMake(self.mapView.userLocation.location.coordinate, span);
//使用系統動畫
[self.mapView setRegion:MKCoordinateRegionMake(self.mapView.userLocation.location.coordinate, span) animated:YES];
}
添加大頭針
- 導入框架
- 遵循協議
- 拷貝屬性
點擊屏幕添加大頭針
其實應該使用長按添加,這裏爲了方便使用點擊添加
- 獲取用戶點擊的位置
- 轉換爲經緯度
- 獲取 location
- 反地理編碼
- 事例代碼
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//1.獲取 用戶點擊的位置
CGPoint point = [[touches anyObject] locationInView:self.mapView];
//2.轉換位置信息爲經緯度
CLLocationCoordinate2D lc = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];
//3.反地理編碼
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
CLLocation *location = [[CLLocation alloc] initWithLatitude:lc.latitude longitude:lc.longitude];
//4.轉換經緯度
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",error);
return ;
}
CLPlacemark *placemark = placemarks.firstObject;
//5.添加大頭針
AMAnnotation *tip = [[AMAnnotation alloc] init];
tip.title = placemark.locality;
tip.subtitle = placemark.name;
tip.coordinate = lc;
[self.mapView addAnnotation:tip];
}];
}
手動控制大頭針的樣式和內容
- 大頭針視圖的代理方法
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
//與 tableviewcell 不同的地方,可以返回 nil
//如果是MKUserLocation類的,就是當前定位位置,不需要設置大頭針
if ([annotation isKindOfClass:[MKUserLocation class]]) {
return nil;
}
//1.設置重用標識
static NSString *ID = @"MKAnnotationView";
//MKAnnotationView默認沒有界面--可以顯示圖片
//MKPinAnnotationView有界面 -- 不可以顯示圖片
MKPinAnnotationView *view = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];
if (view == nil) {
view = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];
}
//iOS9之後纔出現,之前使用 pinColor, 只有三種顏色可用
view.pinTintColor = [UIColor purpleColor];
//設置掉落動畫效果
view.animatesDrop = YES;
//顯示大頭針信息
view.canShowCallout = YES;
//一下三個視圖都必須設置大頭針的 title,否則沒有任何信息
//大頭針左右視圖控件
view.leftCalloutAccessoryView = [UISwitch new];
view.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
//iOS9新特性
//中間的視圖,會遮擋subTitle
view.detailCalloutAccessoryView = [UISwitch new];
return view;
}