首先导入mapKit库,然后导入头文件HMAnnotationView,是自定义的大头针视图
HMAnnotation包含了大头针的属性
#import <MapKit/MapKit.h>
#import "HMAnnotation.h"
#import "HMAnnotationView.h"
@interface ViewController ()<MKMapViewDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (nonatomic, strong) CLLocationManager *locationManager;
@end
ViewController类
- (void)viewDidLoad {
[super viewDidLoad];
// 请求用户授权
self.locationManager = [[CLLocationManager alloc] init];
[self.locationManager requestWhenInUseAuthorization];
// 设置用户跟踪模式
self.mapView.userTrackingMode = MKUserTrackingModeFollow;
// 设置代理
self.mapView.delegate = self;
}
实现代理方法
// 当添加大头针时调用
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(HMAnnotation *)annotation
{
// 和UItableViewCell创建不一样的地方
// return nil 代表大头针的样式由系统控制
// NSLog(@"%@",annotation);
if ([annotation isKindOfClass:[MKUserLocation class]]) {
return nil;
}
return [HMAnnotationView annotationViewWithMapView:mapView];
}
// 即将添加大头针到地图上时调用
// views装着所有大头针的数组
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray<MKAnnotationView *> *)views
{
for (MKAnnotationView *view in views) {
NSLog(@"%@",view);
if ([view isKindOfClass:NSClassFromString(@"MKModernUserLocationView")]) {
continue;
}
// 1.保存当前大头针的位置
CGRect viewFrame = view.frame;
// 2.修改大头针的位置
view.frame = CGRectMake(view.frame.origin.x, 0, view.frame.size.width, view.frame.size.height);
// 3.动画回归大头针最终的位置
[UIView animateWithDuration:5 animations:^{
view.frame = viewFrame;
}];
}
}
- (IBAction)addAnnotation:(id)sender
{
// 销毁特定的一个大头针
// [self.mapView removeAnnotation:<#(nonnull id<MKAnnotation>)#>];
// 销毁多个大头针
[self.mapView removeAnnotations:self.mapView.annotations];
// 创建大头针模型
HMAnnotation *annotation = [[HMAnnotation alloc] init];
// 经纬度
annotation.coordinate = CLLocationCoordinate2DMake(39, 116);
// 标题
annotation.title = @"我心向山,君心向水";
// 子标题
annotation.subtitle = @"我爱着你你却爱着他";
annotation.iconImage = @"苍老师";
// 添加大头针的方法
[self.mapView addAnnotation:annotation];
// 创建大头针模型
HMAnnotation *annotation1 = [[HMAnnotation alloc] init];
// 经纬度
annotation1.coordinate = CLLocationCoordinate2DMake(24, 116);
// 标题
annotation1.title = @"我心向山,君心向水";
// 子标题
annotation1.subtitle = @"我爱着你你却爱着他";
annotation1.iconImage = @"自拍照";
// 添加大头针的方法
[self.mapView addAnnotation:annotation1];
}
HMAnnotion类
#import <MapKit/MapKit.h>
// 1.导入框架
// 2.遵循协议
// 3.拷贝属性
@interface HMAnnotation : NSObject<MKAnnotation>
// 经纬度
@property (nonatomic) CLLocationCoordinate2D coordinate;
// 标题
@property (nonatomic, copy) NSString *title;
// 子标题
@property (nonatomic, copy) NSString *subtitle;
// 图片
@property (nonatomic, copy) NSString *iconImage;
@end
HMAnnotionView类
@interface HMAnnotationView : MKAnnotationView
+ (instancetype)annotationViewWithMapView:(MKMapView *)mapView;
@end
#import "HMAnnotationView.h"
#import "HMAnnotation.h"
@implementation HMAnnotationView
1.首先创建一个唯一的标识符ID
static NSString *ID = @"annotation"
2.根据ID去缓存池取:
MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:ID];
3.如果取不到(为空),再创建
annotationView = [[MKAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:ID];
+ (instancetype)annotationViewWithMapView:(MKMapView *)mapView
{
static NSString *ID = @"annotation";
// 从缓存池取
// MKAnnotationView 默认无界面 能显示图片
// MKPinAnnotationView默认有界面 不能显示图片
HMAnnotationView * annotationView = (HMAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];
if (annotationView == nil) {
annotationView = [[self alloc] initWithAnnotation:nil reuseIdentifier:ID];
// 是否显示标题
annotationView.canShowCallout = YES;
// 下面三个属性存在的前提是设置了标题
// 左视图
annotationView.leftCalloutAccessoryView = [UISwitch new];
// 右视图
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
// 中间视图 会覆盖子标题 iOS9之后的方法
annotationView.detailCalloutAccessoryView = [UISwitch new];
}
return annotationView;
}
// 如果不传入模型,系统会自动帮你调用下面的方法
- (void)setAnnotation:(HMAnnotation *)annotation
{
[super setAnnotation:annotation];
self.image = [UIImage imageNamed:annotation.iconImage];
}
@end