iOS 地图使⽤(二)

作者: iOS_成才录 | 来源:发表于2015-11-12 19:32 被阅读2442次

    一、需求

    效果图.png
    • 1.设计: 将用户当前位置,显示在地图中间,而且点击蓝色点,弹出大头针

    • 2.实现步骤:

      • 查看当前⽤用户位置信息
        • 设置地图代理,并实现代理⽅方法,在代理⽅方法中获取⽤用户当前位置(注意:iOS8.0之后要请求授权!!)
        • 将地图显⽰示中⼼心调整为⽤用户当前所在位置(iOS8.0之前,地图不会⾃自动移动到⽤用户所在位置)
        • 调整当前地图显⽰示的区域(可使⽤用对应代理⽅方法查看当前地图跨度,然后调整到合适跨度即可)
            -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
            {
                /**
                 MKUserLocation : 被称作“大头针模型”,其实喊什么都行,本质就是一个数据模型,只不过此模型遵循了大头针要遵循的协议(MKAnnotation)
                 location:  用户当前所在位置信息(CLLocation对象)
                 title:     大头针标注要显示的标题(NSString对象)
                 subtitle:  大头针标注要显示的子标题(NSString对象)
                 */
                // 根据用户当前位置的经纬度,设置地图显示中心
                /**
                    存在弊端:地图显示比例过大,无法调整
                    解决方案:直接使用对应的调整地图“显示区域”的API
                 */
            //    [mapView setCenterCoordinate:userLocation.coordinate animated:YES];
                /**
                  MKCoordinateSpan 跨度解释:
                  latitudeDelta:纬度跨度,因为南北纬各90度,所以此值的范围是(0---180);此值表示,整个地图视图宽度,显示多大跨度
                  longitudeDelta:经度跨度,因为东西经各180度,所以此值范围是(0---360):此值表示,整个地图视图高度,显示多大跨度
                 注意:地图视图显示,不会更改地图的比例,会以地图视图高度或宽度较小的那个为基准,按比例调整
                 */
            //    MKCoordinateSpan span = MKCoordinateSpanMake(0.1, 0.1);
            //    MKCoordinateRegion region = MKCoordinateRegionMake(userLocation.coordinate, span);
            //    [mapView setRegion:region animated:YES];
            }
    
            // 当地图区域(跨度)改变时调用
            -(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
            {
                NSLog(@"%f---%f", mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta);
            }
    

    二、完整实例:

    • 代码实现:
    #import "ViewController.h"
    #import <MapKit/MapKit.h>
    #import <CoreLocation/CoreLocation.h>
    
    @interface ViewController ()<MKMapViewDelegate>
    @property (weak, nonatomic) IBOutlet MKMapView *mapView;
    
    /** 位置管理者 */
    @property (nonatomic, strong) CLLocationManager *locationM;
    
    @end
    
    @implementation ViewController
    
    #pragma mark -懒加载
    -(CLLocationManager *)locationM
    {
        if (!_locationM) {
            _locationM = [[CLLocationManager alloc] init];
           
            // 版本适配
            if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
                [_locationM requestAlwaysAuthorization];
            }
        }
        return _locationM;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
     
    //    MKMapTypeStandard = 0, // 标准地图
    //    MKMapTypeSatellite, // 卫星云图
    //    MKMapTypeHybrid, // 混合(在卫星云图上加了标准地图的覆盖层)
    //    MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D立体
    //    MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0), // 3D混合
        // 设置地图显示样式(必须注意,设置时 注意对应的版本)
        self.mapView.mapType = MKMapTypeStandard;
        
        
        // 设置地图的控制项
        // 是否可以滚动
    //    self.mapView.scrollEnabled = NO;
        // 缩放
    //    self.mapView.zoomEnabled = NO;
        // 旋转
    //    self.mapView.rotateEnabled = NO;
        
        // 设置地图的显示项(注意::版本适配)
        // 显示建筑物
        self.mapView.showsBuildings = YES;
        // 指南针
        self.mapView.showsCompass = YES;
        // 兴趣点
        self.mapView.showsPointsOfInterest = YES;
        // 比例尺
        self.mapView.showsScale = YES;
        // 交通
        self.mapView.showsTraffic = YES;
        
        // 显示用户位置
        [self locationM];
        // 显示用户位置, 但是地图并不会自动放大到合适比例
       self.mapView.showsUserLocation = YES;
        
        /**
         *  MKUserTrackingModeNone = 0, 不追踪
         MKUserTrackingModeFollow,  追踪
         MKUserTrackingModeFollowWithHeading, 带方向的追踪
         */
        // 不但显示用户位置, 而且还会自动放大地图到合适的比例(也要进行定位授权)
        // 不灵光
    //    self.mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
    }
    
    #pragma mark -MKMapViewDelegate 
    /**
     *  当地图获取到用户位置时调用
     *
     *  @param mapView      地图
     *  @param userLocation 大头针数据模型
     */
    -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
    {
        /**
         *  MKUserLocation : 专业术语: 大头针模型 其实喊什么都行, 只不过这个类遵循了大头针数据模型必须遵循的一个协议 MKAnnotation 
         // title : 标注的标题
         // subtitle : 标注的子标题
         */
        userLocation.title = @"标题";
        userLocation.subtitle = @"子标题";
        
        // 移动地图的中心,显示用户的当前位置
    //    [mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
        
        // 显示地图的显示区域
        // 控制区域中心
        CLLocationCoordinate2D center = userLocation.location.coordinate;
        
        // 设置区域跨度
        MKCoordinateSpan span = MKCoordinateSpanMake(0.077919, 0.044529);
    
        // 创建一个区域
        MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
        // 设置地图显示区域
        [mapView setRegion:region animated:YES];
    }
    
    /**
     *  地图区域已经改变时带哦用
     *
     *  @param mapView  地图
     *  @param animated 动画
     */
    -(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
    {
        NSLog(@"%f---%f", mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta);
    }
    
    /**
     *  地图区域将要改变时带哦用
     *
     *  @param mapView  地图
     *  @param animated 动画
     */
    -(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
    {
      
    }
    @end
    

    相关文章

      网友评论

      本文标题:iOS 地图使⽤(二)

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