首先導入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;
}
實現(xiàn)代理方法
// 當添加大頭針時調用
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(HMAnnotation *)annotation
{
// 和UItableViewCell創(chuàng)建不一樣的地方
// return nil 代表大頭針的樣式由系統(tǒng)控制
// NSLog(@"%@",annotation);
if ([annotation isKindOfClass:[MKUserLocation class]]) {
return nil;
}
return [HMAnnotationView annotationViewWithMapView:mapView];
}
// 即將添加大頭針到地圖上時調用
// views裝著所有大頭針的數(shù)組
- (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];
// 創(chuàng)建大頭針模型
HMAnnotation *annotation = [[HMAnnotation alloc] init];
// 經(jīng)緯度
annotation.coordinate = CLLocationCoordinate2DMake(39, 116);
// 標題
annotation.title = @"我心向山,君心向水";
// 子標題
annotation.subtitle = @"我愛著你你卻愛著他";
annotation.iconImage = @"蒼老師";
// 添加大頭針的方法
[self.mapView addAnnotation:annotation];
// 創(chuàng)建大頭針模型
HMAnnotation *annotation1 = [[HMAnnotation alloc] init];
// 經(jīng)緯度
annotation1.coordinate = CLLocationCoordinate2DMake(24, 116);
// 標題
annotation1.title = @"我心向山,君心向水";
// 子標題
annotation1.subtitle = @"我愛著你你卻愛著他";
annotation1.iconImage = @"自拍照";
// 添加大頭針的方法
[self.mapView addAnnotation:annotation1];
}
HMAnnotion類
#import <MapKit/MapKit.h>
// 1.導入框架
// 2.遵循協(xié)議
// 3.拷貝屬性
@interface HMAnnotation : NSObject<MKAnnotation>
// 經(jīng)緯度
@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.首先創(chuàng)建一個唯一的標識符ID
static NSString *ID = @"annotation"
2.根據(jù)ID去緩存池取:
MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:ID];
3.如果取不到(為空)告匠,再創(chuàng)建
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;
}
// 如果不傳入模型,系統(tǒng)會自動幫你調用下面的方法
- (void)setAnnotation:(HMAnnotation *)annotation
{
[super setAnnotation:annotation];
self.image = [UIImage imageNamed:annotation.iconImage];
}
@end