zoukankan      html  css  js  c++  java
  • ios开发-MapKit(地图框架)使用简介

    我们使用app的时候,很多软件都自带了地图功能。我们可以看到自己的位置,看到周围商场等信息。我们也可以导航,划线等。

    其实苹果的MapKit使用起来还是很简单的。这里简单的介绍一下。

    0.使用前准备

    1.导入MapKit.framework框架

    2.在工程的info.plist中增加两行字段(ios8必须做这两个步骤)

    NSLocationAlwaysUsageDescription
    NSLocationWhenInUseDescription
     
    3.在storyboard普通控制器中,拖一个mapKitView,并设置好约束,并连线获得属性
    //地图
    @property (weak, nonatomic) IBOutlet MKMapView *mapView;
     
     
    1.向用户获取定位授权
    在一个普通的控制器中,导入头文件,

    #import <MapKit/MapKit.h>

    #import <CoreLocation/CoreLocation.h>

    CoreLocation是核心定位

    设置一个CLLocationManager属性,用于请求授权

    //位置管理器
    @property (nonatomic, strong) CLLocationManager *manager;
    
    //懒加载位置管理器
    - (CLLocationManager *)manager
    {
        if (_manager == nil) {
            _manager = [[CLLocationManager alloc] init];
        }
        return _manager;
    }

    然后请求访问位置,并设置地图跟踪模式

        //请求允许访问位置
        [self.manager requestAlwaysAuthorization];
        
        //当前地图跟踪模式
        self.mapView.userTrackingMode = MKUserTrackingModeFollow;

    这时候 ,我们真机运行就能定位到自己的位置了(模拟器可以自己设置经纬度),那个蓝色的大圆点就是我们的位置,俗称大头针

     

    2.添加大头针描述

    我们点击大头针的时候,希望看到当前的位置信息。这里我们可以来设置一下。

    先设置mapView的代理为self,并遵守代理

        //设置地图代理
        self.mapView.delegate = self;

    在实现下面的代理方法,此方法每次位置变动,都会调用

    //更新位置的时候,会触发
    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
    {
        NSLog(@"11");
        //当前的坐标,反编码
        CLGeocoder *geo = [[CLGeocoder alloc] init];
        [geo reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray *placemarks, NSError *error) {
            //取出标记
            CLPlacemark *pm = [placemarks lastObject];
            //赋值
            userLocation.title = pm.name;
        }];
       
    }

    上面的CLGeocoder是一个地理编码解析器。可以将位置信息转为给定名称。也可以将给定的名称(例如北京)装换为位置信息(经纬度等等)。

    userLocation中,只有location位置信息。我们可以转为具体的地理名称

    实现上面的代理之后,我们点击蓝色大头针,就可以看到具体的信息啦。

     

    3.添加大头针

    我们点击地图其它的地方,希望可以钉一个大头针,手指点哪里,哪里就钉一个

    这个做法其实也很简单,我们需要自定义一个大头针类,遵守MKAnnotation协议,并实现协议内容

    #import <Foundation/Foundation.h>
    #import <MapKit/MapKit.h>
    
    @interface HJCAnnotion : NSObject <MKAnnotation>
    
    //位置(必选)
    @property (nonatomic, assign) CLLocationCoordinate2D coordinate;
    //标题(可选)
    @property (nonatomic, copy) NSString *title;
    //子标题(可选)
    @property (nonatomic, copy) NSString *subtitle;
    
    @end

    先给mapView添加手势

        //创建手势
        UITapGestureRecognizer *top = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(addMyAnootation:)];
        //加入地图上
        [self.mapView addGestureRecognizer:top];

    在实现手势方法

    //点击地图时候,添加大头针的方法
    - (void)addMyAnootation:(UITapGestureRecognizer *)top
    {
        //获得手点击的坐标
        CGPoint touchPoint = [top locationInView:top.view];
        //装换为地图的坐标
        CLLocationCoordinate2D cd = [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView];
        
        //创建自定义的大头针
        HJCAnnotion *annotation = [[HJCAnnotion alloc] init];
        //设置大头针的坐标
        annotation.coordinate = cd;
        //设置大头针的标题
        annotation.title = @"呵呵";
        
        //添加到地图中
        [self.mapView addAnnotation:annotation];
        
    }

     

    4.自定义大头针View

    我们加入不想用系统默认的红头的大头针,我们就可以自定义大头针的view了。通过代理实现。这里需要考虑view重用的问题

    返回nil就表示用系统默认的

    //自定义大头针view
    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
    {
        //假如是定位的蓝色大头针,直接返回nil
        if ([annotation isKindOfClass:[MKUserLocation class]]) {
            return nil;
        }
        
        //可重用ID
        static NSString *viewID = @"myAnnotation";
        //从缓存池中取
        MKAnnotationView *annoView = [mapView dequeueReusableAnnotationViewWithIdentifier:viewID];
        //加入没有重新创建
        if(annoView == nil){
            annoView = [[MKAnnotationView alloc] init];
        }
        //赋值
        annoView.image = [UIImage imageNamed:@"category_1"];
        //返回
        return annoView;
    }

     

     

     

  • 相关阅读:
    数据库中生成UUID的方式
    db2如果修改主机名之后
    linux修改主机名
    db2动态查看备份进度
    oracle-DG
    linux环境变量和对应文件的生效顺序
    数据泵与传统exp/imp对比
    oracle之ogg部署(RAC到单机)
    oracle之ogg部署(单机到单机)
    达梦 (实时主备+数据守护)测试
  • 原文地址:https://www.cnblogs.com/haojuncong/p/4545316.html
Copyright © 2011-2022 走看看