添加大头针

2016-06-12  本文已影响97人  lee_moons

首先导入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
上一篇下一篇

猜你喜欢

热点阅读