iOS地图的使用

作者: Supermannnn | 来源:发表于2016-12-27 13:20 被阅读0次

    前言:让有需要的人看一眼,如果能得到一些自己需要的,我将倍感荣幸.

    注意###

    如果用storyBoard的mapView要导入MapKit的framework.因为Xcode5以后,系统会自己导入框架,但是storyBoard要先于代码执行.所以要先导入框架.
    如果一切弄好了,发现定位错了,改一下当前定位的位置
    simulator的Debug->location->customer location -> 39,116(随便写,别写出国去,台湾是中国的一个省)
    可以cmd R 运行一下 看一眼 然后进行下面的代码

    设置地图类型###

    //地图视图
    @property (weak, nonatomic) IBOutlet MKMapView *mapView;
    
    /*
        //标准
        MKMapTypeStandard = 0,
        //卫星
        MKMapTypeSatellite,
        //鸟瞰
        MKMapTypeHybrid,
        //以下两个暂时国内没用到
        MKMapTypeSatelliteFlyover ,
        MKMapTypeHybridFlyover ,
        */
        self.mapView.mapType = MKMapTypeStandard;
        //实时交通状况
        // Affects MKMapTypeStandard and MKMapTypeHybrid(意思是只能在标准和鸟瞰下使用)
        self.mapView.showsTraffic = true;
       //显示用户位置
        /*
         不跟踪
         MKUserTrackingModeNone = 0,
         跟踪
         MKUserTrackingModeFollow,
         有方向的跟踪
         MKUserTrackingModeFollowWithHeading
         */
        self.mapView.userTrackingMode = MKUserTrackingModeFollow;
        //定位必须授权  别忘了info.plist文件,key不要写错
        self.locationManager = [CLLocationManager new];
        [self.locationManager requestWhenInUseAuthorization];
       //有可能用模拟器出不来交通状况,用真机则没有这些情况,应该是模拟器的一些bug.
    

    点击定位的蓝色光圈显示真实位置###

    现在点击蓝色光圈,显示的是My Location 不想要这个,想要具体位置
    我在代码块里面标注123,显示的会清晰一些 所用代码还是上面的代码块,进行添加

    //点击蓝色光圈 显示具体位置 步骤
        //1.设置地图代理
        self.mapView.delegate = self;
       //2.遵循协议 <MKMapViewDelegate>
       //3.实现方法
    //代理方法---定位到用户位置  会调用(也就是userLocation -->大头针(有时间 会另起一章写一下看心情= =))
    -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
    //点击MKUserLocation 进去找到 title和subTitle的属性 先设置一下,看看效果如何
    //    userLocation.title = @"北京市";
    //    userLocation.subtitle = @"天安门";
    //可以进行修改,查找正确
        //cmd 点击 MKUserLocation 进去再查找所需要属性  发现 @property (readonly, nonatomic, nullable) CLLocation *location; 有位置  可以进行反地理编码
        //反地理编码 步骤走一波
    //1.创建对象
        CLGeocoder *gecoder = [CLGeocoder new];
    //2.调用方法
        [gecoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    //防错
            if (error) {
                NSLog(@"%@",error);
                return;
            }
    //赋值
            userLocation.title = placemarks[0].locality;
            userLocation.subtitle = placemarks[0].name;
        }];
    }
    //当网速慢的时候,要等一会,如果就是不想要My Location就把那两个title设置为正在加载,怎么开心怎么玩.
    

    点击按钮 返回定位位置###

    玩过地图的都知道 你找地方的时候,有个按钮 点一下就能回到最初的定位位置
    用此方法可以回到当前位置,前提不放大不缩小 因为方法会以你最后一次的比例尺为标准 恢复到定位位置 我们需要的是 一开始的比例尺的定位

    //拖线方法
    - (IBAction)backAction {
        //将用户的位置  设置为地图的中心点的经纬度
        self.mapView.centerCoordinate = self.mapView.userLocation.coordinate;
    }
    

    改善 发现问题 2.0给的不对,确实用的是2.0的比例尺,但是和一开始的定位不对,肯定就是span的错了,那么想法弄到最原始的span的两个值就搞定

    - (IBAction)backAction {
        //将用户的位置  设置为地图的中心点的经纬度
        self.mapView.centerCoordinate = self.mapView.userLocation.coordinate;
        //改善  确定区域:1.中心点经纬度 2.经纬度跨度
        /*
         region:
         跨度结构体(span):
         typedef struct {
         CLLocationDegrees latitudeDelta;
         CLLocationDegrees longitudeDelta;
         } MKCoordinateSpan;
         //区域结构体(region)
         typedef struct {
         CLLocationCoordinate2D center;
         MKCoordinateSpan span;
         } MKCoordinateRegion;
         
         */
        //跨度 CLLocationDegrees latitudeDelta = double
        MKCoordinateSpan span = MKCoordinateSpanMake(2.0, 2.0);
        //给mapView的region赋值
        self.mapView.region = MKCoordinateRegionMake(self.mapView.userLocation.location.coordinate, span);
    }
    

    求地图定位的时候span两个值的大小 想都不用想 肯定是代理方法

    //地图区域一旦改变 就会调用
    -(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
        NSLog(@"longitudeDelta = %f,latitudeDelta = %f",self.mapView.region.span.longitudeDelta,self.mapView.region.span.latitudeDelta);
    }
    打印出来得出结果  longitudeDelta = 0.015407,latitudeDelta = 0.021045 这就是我们需要的两个span值 
    修改span
    MKCoordinateSpan span = MKCoordinateSpanMake(0.015407, 0.021045);
    

    缩小地图 span的两个值就变大 放大就变小 比例尺吗 越清晰表明比例越小

    变化的时候让其有动画效果--要用动画的时候,先看看有没有系统自己的,系统的无非都是set带动画,找一下,如果还没有,自己加一个动画,我前面写过UIView的那些动画,这里都可以用上.

    [self.mapView setRegion:MKCoordinateRegionMake(self.mapView.userLocation.location.coordinate, span) animated:true];
    

    增加放大缩小按钮###

    拖线方法

    //改变地图大小的按钮
    - (IBAction)changeMap:(UIButton *)sender {
        switch (sender.tag) {
            case 1:{//放大 地图的跨度中的经纬度 * 0.5
                //修改当前跨度
                //纬度跨度
                CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 0.5;
                //经度跨度
                CGFloat longitudeDelta = self.mapView.region.span.longitudeDelta * 0.5;
                MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
                [self.mapView setRegion:MKCoordinateRegionMake(self.mapView.centerCoordinate, span) animated:true];
                
                break;
            }
            case 2:{//缩小 地图的跨度中的经纬度 * 2
                //修改当前跨度
                //纬度跨度
                CGFloat latitudeDelta = self.mapView.region.span.latitudeDelta * 2;
                //经度跨度
                CGFloat longitudeDelta = self.mapView.region.span.longitudeDelta * 2;
                MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
                [self.mapView setRegion:MKCoordinateRegionMake(self.mapView.centerCoordinate, span) animated:true];
                break;
            }
            default:
                break;
        }
    }
    

    这里重点有两个 1,你要确定的中心点位置,千万不要写成self.mapView.userLocation.coordinate这个,你是以当前用户定位所在为中心点,你看别处的时候相放大就会回到定位位置,所以你要清晰的知道 中心点是当前地图的中心self.mapView.centerCoordinate 2,还是放大缩小比例尺的逻辑问题,错了没事,弄错只会相反嘛,改过就是了.

    本文不针对任何学术性研究,单纯为了娱乐.看不惯我就直说,反正我不改.

    宝剑锋从磨砺出,梅花香自苦寒来.

    相关文章

      网友评论

        本文标题:iOS地图的使用

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