美文网首页
添加大头针

添加大头针

作者: lee_moons | 来源:发表于2016-06-12 16:34 被阅读97次

    首先导入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
    

    相关文章

      网友评论

          本文标题:添加大头针

          本文链接:https://www.haomeiwen.com/subject/pcgedttx.html