美文网首页自己尝试等装一下iOS开发代码段iOS 地图的奇技淫巧
iOS开发之地图-添加多个大头针及自定义大头针视图

iOS开发之地图-添加多个大头针及自定义大头针视图

作者: IOS_龙 | 来源:发表于2016-03-27 19:09 被阅读5803次

    前言
    学习地图,我们必须要接触两个框架:
    Core Location,主要包含定位、地理编码、反编码功能,如需了解请移步iOS开发之地图-定位/编码与反编码
    MapKit,利用他可以对地图进行精准的控制,比如,放置大头针、地图类型切换,导航等等。
    本文我们主要介绍的是使用MapKit框架对地图试图进行精准的控制。
    如果无法显示自己的位置,检查以下几点:
    是否将定位管理器设为全局变量
    是否在项目中进行定位授权,是否在Info.plist中配置
    是否将showsUserLocation设为YES。
    是否配置模拟器 点击模拟器 -> 菜单栏Dubug -> Location -> Apple来使模拟器定位,然后使用Custom Location配置模拟器的经纬度。

    添加多个大头针及自定义大头针视图代码示例:
    此链接下是自定义大头针的Demo可自行下载
    ViewController.m(.h声明文件中没有写代码)

        //
        //  ViewController.m
        //  CustomeAnnotationView
        //
        //  Created by 王龙 on 16/3/19.
        //  Copyright © 2016年 Larry(Lawrence). All rights reserved.
        //
    
        #import "ViewController.h"
        #import <MapKit/MapKit.h>
        #import <CoreLocation/CoreLocation.h>
        #import "MyAnnotation.h"
        #import "CustomPinAnnotationView.h"
    
        @interface ViewController ()<MKMapViewDelegate>
        {
            CLLocationManager *_locationManager;
            MKMapView *_mapView;
        }
    
        @property (nonatomic,retain) NSMutableArray *locationArray;
    
        @end
        @implementation ViewController
    
        - (void)viewDidLoad {
            [super viewDidLoad];
    
        //    定位授权
    
            _locationManager = [[CLLocationManager alloc]init];
            [_locationManager requestWhenInUseAuthorization];
        //    地图视图
            _mapView = [[MKMapView alloc]initWithFrame:self.view.frame];
            _mapView.showsUserLocation = YES;
            _mapView.delegate = self;
            [self.view addSubview:_mapView];  
        }
    
        - (void)loadData{
            NSString *filePath = [[NSBundle mainBundle]pathForResource:@"PinData" ofType:@"plist"];
            NSArray *tempArray = [NSArray arrayWithContentsOfFile:filePath];
    
        //    把plist数据转换成大头针model
            for (NSDictionary *dict in tempArray) {
                MyAnnotation *myAnnotationModel = [[MyAnnotation alloc]initWithAnnotationModelWithDict:dict];
        
                [self.locationArray addObject:myAnnotationModel];
            }
    
        //    核心代码
            [_mapView addAnnotations:self.locationArray];
        }
    
        #pragma mark ------ delegate
        - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
    userLocation.title  =@"你好";
    
            _mapView.centerCoordinate = userLocation.coordinate;
    
            [_mapView setRegion:MKCoordinateRegionMake(userLocation.coordinate, MKCoordinateSpanMake(0.3, 0.3)) animated:YES];
        //    如果在ViewDidLoad中调用  添加大头针的话会没有掉落效果  定位结束后再添加大头针才会有掉落效果
            [self loadData];
    
        }
    
        - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
    
            /*
     
             * 大头针分两种
     
             * 1. MKPinAnnotationView:他是系统自带的大头针,继承于MKAnnotationView,形状跟棒棒糖类似,可以设置糖的颜色,和显示的时候是否有动画效果
     
             * 2. MKAnnotationView:可以用指定的图片作为大头针的样式,但显示的时候没有动画效果,如果没有给图片的话会什么都不显示
     
             * 3. mapview有个代理方法,当大头针显示在试图上时会调用,可以实现这个方法来自定义大头针的动画效果,我下面写有可以参考一下
     
             * 4. 在这里我为了自定义大头针的样式,使用的是MKAnnotationView
     
             */
    
    
            //    判断是不是用户的大头针数据模型
            if ([annotation isKindOfClass:[MKUserLocation class]]) {
                MKAnnotationView *annotationView = [[MKAnnotationView alloc]init];
                annotationView.image = [UIImage imageNamed:@"acc"];
        
        //        是否允许显示插入视图*********
                annotationView.canShowCallout = YES;
        
                return annotationView;
            }
    
            CustomPinAnnotationView *annotationView = (CustomPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"otherAnnotationView"];
    if (annotationView == nil) {
        annotationView = [[CustomPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"otherAnnotationView"];
    }
            MyAnnotation *myAnnotation = annotation;
            switch ([myAnnotation.type intValue]) {
                case SUPER_MARKET:
                    annotationView.image = [UIImage imageNamed:@"super"];
                    annotationView.label.text = @"超市";
                    break;
                case CREMATORY:
                    annotationView.image = [UIImage imageNamed:@"chang"];
                    annotationView.label.text = @"火场";
                    break;
                case INTEREST:
                    annotationView.image = [UIImage imageNamed:@"jingqu"];
                    annotationView.label.text = @"风景区";
            break;
            
                default:
                    break;
            }
    
            return annotationView;
        }
    
    
                //大头针显示在视图上时调用,在这里给大头针设置显示动画
        - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray<MKAnnotationView *> *)views{
        //    获得mapView的Frame
            CGRect visibleRect = [mapView annotationVisibleRect];
            for (MKAnnotationView *view in views) {
        
                CGRect endFrame = view.frame;
                CGRect startFrame = endFrame;
                startFrame.origin.y = visibleRect.origin.y - startFrame.size.height;
                view.frame = startFrame;
                [UIView beginAnimations:@"drop" context:NULL];
                [UIView setAnimationDuration:1];
                view.frame = endFrame;
                [UIView commitAnimations];
            }
        }
    
        #pragma mark lazy load
    
        - (NSMutableArray *)locationArray{
    
            if (_locationArray == nil) {
        
                _locationArray = [NSMutableArray new];
        
            }
            return _locationArray;
        }
    
        @end
    

    MyAnnotation.h中

        //
        //  MyAnnotation.h
        //  CustomeAnnotationView
        //
        //  Created by 王龙 on 16/3/19.
        //  Copyright © 2016年 Larry(Lawrence). All rights reserved.
        //
    
        #import <Foundation/Foundation.h>
    
        //注意导入框架
    
        #import <MapKit/MapKit.h>
    
        /**
         *  大头针枚举
         */
        typedef NS_ENUM(NSInteger,PinType) {
            /**
             *  超市
             */
            SUPER_MARKET = 0,
            /**
             *  火场
             */
            CREMATORY,
            /**
             *  景点
             */
            INTEREST,
        };
    
        //该模型是大头针模型 所以必须实现协议MKAnnotation协议 和CLLocationCoordinate2D中的属性coordinate
        @interface MyAnnotation : NSObject<MKAnnotation>
    
        @property (nonatomic,assign) CLLocationCoordinate2D coordinate;
        @property (nonatomic,copy) NSString *name;
        @property (nonatomic,copy) NSString *title;
        @property (nonatomic,retain) NSNumber *type;
    
        - (instancetype)initWithAnnotationModelWithDict:(NSDictionary *)dict;
    
    
        @end
    

    MyAnnotation.m中

        //
        //  MyAnnotation.m
        //  CustomeAnnotationView
        //
        //  Created by 王龙 on 16/3/19.
        //  Copyright © 2016年 Larry(Lawrence). All rights reserved.
        //
    
        #import "MyAnnotation.h"
    
        @implementation MyAnnotation
    
    
        - (instancetype)initWithAnnotationModelWithDict:(NSDictionary *)dict{
            self = [super init];
            if (self) {
        
        
                self.coordinate = CLLocationCoordinate2DMake([dict[@"coordinate"][@"latitute"] doubleValue], [dict[@"coordinate"][@"longitude"] doubleValue]);
                self.title = dict[@"detail"];
                self.name = dict[@"name"];
                self.type = dict[@"type"];  
            }
            return self;
        }
    
        @end
    

    CustomPinAnnotationView.h中

        //
        //  CustomPinAnnotationView.h
        //  CustomeAnnotationView
        //
        //  Created by 王龙 on 16/3/19.
        //  Copyright © 2016年 Larry(Lawrence). All rights reserved.
        //
    
        #import <MapKit/MapKit.h>
        #import "MyAnnotation.h"
    
        @interface CustomPinAnnotationView : MKAnnotationView
        @property (nonatomic,strong) UILabel *label;
        @end
    

    CustomPinAnnotationView.m中

        //
       //  CustomPinAnnotationView.m
       //  CustomeAnnotationView
       //
       //  Created by 王龙 on 16/3/19.
       //  Copyright © 2016年 Larry(Lawrence). All rights reserved.
       //
    
       #import "CustomPinAnnotationView.h"
    
       @implementation CustomPinAnnotationView
    
    
       - (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier{
           self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
           if (self) {
        
       //        在大头针旁边加一个label
               self.label = [[UILabel alloc]initWithFrame:CGRectMake(0, -15, 50, 20)];
               self.label.textColor = [UIColor redColor];
               self.label.textAlignment = NSTextAlignmentCenter;
               self.label.font = [UIFont systemFontOfSize:20];
               [self addSubview:self.label];
        
           }
           return self;
    
       }
       @end

    相关文章

      网友评论

      • b2efe7751b24:为什么加了一个数组的大头针进去,就显示了一个?
      • 如晴天似雨天_1013:大神~你这是高德地图吗?我特么百度地图的再看:disappointed_relieved:
      • 狐冰:请问,坐标定在南纬是个啥
      • iOS_沧海一笑:你好,我有几个关于地图使用的问题请教你!
        属鱼的加菲猫:大兄弟也在搞地图?
        我最近也在弄
      • 路遥长夜记忆从不舍弃:点击这个大头针能够弹框吗
      • 叫我马小帅:请问添加大头针可不可以不给坐标 就是点哪 然后在那就加一个大头针
        IOS_龙:当然可以了!
      • 天下尬唱:自定义大头针,加载网络图片有什么有效的方法么?
      • 滚来滚去的桔子:我也是不进 viewForAnnotation 方法。下面是添加代码,遵守的是MKOverlay协议。
        ```
        MyAnnotation *annotation = [MyAnnotation new];
        annotation.coordinate = locCoordinateA;
        annotation.title = @"wode";
        annotation.boundingMapRect = MKMapRectMake(1.0, 1.0, 50, 50);
        [mapView addOverlay:annotation level:MKOverlayLevelAboveLabels];
        ```
        滚来滚去的桔子:@滚来滚去的桔子 知道了,应该用addAnnotation而不是addOverlay:joy:
        滚来滚去的桔子:设置了显示用户位置,用户位置的 annotation 可以进这个方法,但是自定义的就不进。
      • 不要动:都没有进这个方法哪里 CustomPinAnnotationView *annotationView = (CustomPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"otherAnnotationView"];

        if (annotationView == nil)
        {
        annotationView = [[CustomPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"otherAnnotationView"];
        }
        MyAnnotation *myAnnotation = annotation;
        switch ([myAnnotation.type intValue]) {
        case SUPER_MARKET:
        annotationView.image = [UIImage imageNamed:@"super"];
        annotationView.label.text = @"超市";
        break;
        case CREMATORY:
        annotationView.image = [UIImage imageNamed:@"chang"];
        annotationView.label.text = @"火场";
        break;
        case INTEREST:
        annotationView.image = [UIImage imageNamed:@"jingqu"];
        annotationView.label.text = @"风景区";
        break;

        default:
        break;
        }

        return annotationView;
        Renjiee:@ios新手 你好 请问你是怎么解决的 我也遇到同样的问题
        不要动:@IOS_龙 好的,已解决
        IOS_龙:@ios新手 你是怎么设置的,本人QQ:1340380530 欢迎一起讨论。
      • 不要动:没有啊,只有一个大头针,
      • 晨阳聊电影:王龙,记得关注我~
        晨阳聊电影:@IOS_龙 晨阳
        IOS_龙:@飞翔云端的鱼 报名?
      • 晨阳聊电影:可以的

      本文标题:iOS开发之地图-添加多个大头针及自定义大头针视图

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