使用TableView时,通常会抽取Cell,自定义大头针视图也是一样
提取代码:
#import "JSAnnotationView.h"
@implementation JSAnnotationView
+ (instancetype)annotationViewWithMapView:(MKMapView *)mapView WithAnnotation:(id<MKAnnotation>)annotation WithIdentifier:(NSString *)identifier{
// 设置颜色需要使用MKAnnotationView的子类才行 MKPinAnnotationView
JSAnnotationView *anno = (JSAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (anno == nil) {
anno = [[JSAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:identifier];
}
// 设置属性 (父类(MKAnnotationView)没有动画滑落和pinTintColor属性)
// 设置显示标注
anno.canShowCallout = YES;
/*
MKPinAnnotationView 默认视图就是大头针样式(棒棒糖)
如果要自定义图像,需要使用父类,不能使用MKPinAnnotationView
*/
anno.image = [UIImage imageNamed:@"自拍照"];
return anno;
}
@end
外界使用时,导入头文件,根据提供的类方法创建自定义大头针视图
/**
* 当设置大头针视图的时候大头针模型时调用
*
* @param mapView 地图视图
* @param annotation 大头针模型
*
* @return 大头针视图
*/
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
static NSString *identifier = @"annotation";
// 排除定位大头针(否则定位大头针样式也会被修改掉)
if ([annotation isKindOfClass:[MKUserLocation class]]) {
return nil;
}
JSAnnotationView *annotationView = [JSAnnotationView annotationViewWithMapView:mapView WithAnnotation:annotation WithIdentifier:identifier];
return annotationView;
}
如果创建大头针视图类方法中的annotation参数传递nil,系统会根据代理方法(viewForAnnotation)对应的大头针模型进行设置
JSAnnotationView *annotationView = [JSAnnotationView annotationViewWithMapView:mapView nil WithIdentifier:identifier];