-
MapKit
是用来显示地图的. -
MapKit
的使用步骤- 导入框架
MapKit
- 导入头文件
#import <MapKit/MapKit.h>
- 在
storyboard
中拖拽MKMapView
- 导入框架
- 地图属性的设置
// 1. MKMapView的显示项 // 1.1 设置地图的显示样式 /* MKMapTypeStandard 标准 MKMapTypeSatellite 卫星 MKMapTypeHybrid 混合 MKMapTypeSatelliteFlyover 3D卫星(10_11, 9_0), MKMapTypeHybridFlyover 3D混合(10_11, 9_0), */ self.mapView.mapType = MKMapTypeStandard; // 1.2 显示地图上的指南针 self.mapView.showsCompass = YES; // 1.3 显示地图上的建筑物 self.mapView.showsBuildings = YES; // 1.4 显示地图上的POI点 self.mapView.showsPointsOfInterest = YES; // 1.5 显示地图上的缩放比例 self.mapView.showsScale = YES; // 1.6 显示地图上的交通 self.mapView.showsTraffic = YES; // 1.7 显示用户当前位置 // 1.7.1 在iOS8.0之后要请求用户授权 [self locationManager]; // 1.7.2 显示用户当前位置(如果不设置追踪模式,地图不会自动放大) self.mapView.showsUserLocation = YES; // 1.7.3 设置用户的追踪模式 self.mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading; // 2. MKMapView的控制项 // 2.1 地图滚动 self.mapView.scrollEnabled = YES; // 2.2 地图缩放 self.mapView.zoomEnabled = YES; // 2.3 地图旋转 self.mapView.rotateEnabled = YES;
- 地图的使用-结合代理方法
didUpdateUserLocation
和regionDidChangeAnimated
// 1. 查看用户当前位置信息 NSLog(@"didUpdateUserLocation-------%f, %f", userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude); // 1.1 设置标题 userLocation.title = @"qwer"; // 1.2 设置子标题 userLocation.subtitle = @"asdf"; // 2. 调整地图显示中心 // 2.1 获取用户的位置信息 CLLocationCoordinate2D center = userLocation.location.coordinate; // 2.2 设置地图的中心为用户的位置 [self.mapView setCenterCoordinate:center animated:YES]; // 3. 调整地图显示区域(根据代理方法获取到的数据创建跨度) // 3.1 创建跨度 MKCoordinateSpan span = MKCoordinateSpanMake(0.001371, 0.001006); // 3.2 创建区域 MKCoordinateRegion region = MKCoordinateRegionMake(center, span); // 3.3 设置地图显示区域为创建的区域 [self.mapView setRegion:region animated:YES];
- 大头针的基本使用
- 实现步骤
- 创建地图
- 定义大头针数据模型类
- 创建大头针数据模型
- 添加大头针数据模型
- 代码实现
/* 大头针数据模型类 */ @interface ZQAnnotation : NSObject <MKAnnotation> /** 经纬度 */ @property (nonatomic, assign) CLLocationCoordinate2D coordinate; /** 弹框标题 */ @property (nonatomic, copy, nullable) NSString *title; /** 弹框子标题 */ @property (nonatomic, copy, nullable) NSString *subtitle; @end /* 控制器view */ @interface ViewController () @property (weak, nonatomic) IBOutlet MKMapView *mapView; @end /*touchesBegan方法*/ // 1. 创建大头针数据模型 ZQAnnotation *annotation = [[ZQAnnotation alloc] init]; // 1.1 设置大头针数据模型的数据 annotation.coordinate = self.mapView.centerCoordinate; annotation.title = @"qwer"; annotation.subtitle = @"asdf"; // 2. 添加大头针数据模型 [self.mapView addAnnotation:annotation]; /* touchesMoved方法 */ NSArray *annotations = self.mapView.annotations; [self.mapView removeAnnotations:annotations];
- 实现步骤
- 大头针使用场景案例
- 实现步骤
- 创建地图
- 自定义大头针数据模型
- 获取手指所在的点
- 添加大头针数据模型
- 标注弹框
- 关键代码
/* 场景描述:鼠标点击在地图哪个位置, 就在对应的位置添加一个大头针, 并在标注弹框中显示对应的城市和街道 */
pragma mark ------------------
- 实现步骤
pragma mark - Events
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 1. 获取手指所在的点
CGPoint touch = [[touches anyObject] locationInView:self.mapView];
// 2. 把点转化为经纬度
CLLocationCoordinate2D coordinate = [self.mapView convertPoint:touch toCoordinateFromView:self.mapView];
// 3. 添加大头针数据模型
ZQAnnotationItem *annotationItem = [self addAnnotationItemWithCoordinate:coordinate title:@"小码哥" subTitle:@"iOS"];
// 4. 反地理编码
CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
[self.geoCoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (error == nil) {
// 从地标数组中获取地标对象
CLPlacemark *placemark = [placemarks firstObject];
// 设置弹框标题
annotationItem.title = placemark.name;
// 设置弹框子标题
annotationItem.subtitle = placemark.locality;
}
}];
}
#pragma mark ------------------
#pragma mark - Methods
-(ZQAnnotationItem *)addAnnotationItemWithCoordinate:(CLLocationCoordinate2D)coordinate title:(NSString *)title subTitle:(NSString *)subTitle{
// 创建大头针数据模型对象
ZQAnnotationItem *annotationItem = [[ZQAnnotationItem alloc] init];
// 设置数据
annotationItem.coordinate = coordinate;
annotationItem.title = title;
annotationItem.subtitle = subTitle;
// 添加大头针数据模型
[self.mapView addAnnotation:annotationItem];
return annotationItem;
}
```
* 知识点
* 获取手指所在的点
* 把点转化为经纬度
* 反地理编码
- 自定义大头针
- 注意事项:如果
viewForAnnotation
这个方法没有实现,或者, 返回nil, 那么系统就会调用默认的大头针视图 - 理论基础:如果想要自定义大头针,要么是用父类MKAnnotationView , 或者是自定义的子类
- 自定义子类
MKPinAnnotationView
- 用父类
MKAnnotationView
static NSString *ID = @"XMG";
// 访问缓存池
MKAnnotationView *pinView = [mapView dequeueReusableAnnotationViewWithIdentifier:ID];
// 自己创建
if (pinView == nil) {
pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];
}
// 防止数据错乱
pinView.annotation = annotation;
// 设置弹框
pinView.canShowCallout = YES;
// 设置大头针图片
pinView.image = [UIImage imageNamed:@"category_3"];
// 设置弹框左侧图片
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Snip20160122_1"]];
pinView.leftCalloutAccessoryView = imageView;
return pinView;
``` - 自定义子类
- 注意事项:如果