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;
}