zoukankan      html  css  js  c++  java
  • (七十九)MapKit的基本使用

    MapKit是苹果公司开发的用于显示地图和实现定位、导航的地图框架。

    MapKit View可以通过storyboard、xib创建,也可以通过代码直接创建。

    需要注意的是,通过storyboard和xib创建的话,需要手动导入MapKit框架,否则会报错,因为storyboard、xib无法解析MKMapView这个类。

    要使用此框架,首先手动导入框架(以便在storyboard和xib上使用),然后引用框架的主头文件和CoreLocation的主头文件:

    #import <MapKit/MapKit.h>
    #import <CoreLocation/CoreLocation.h>
    我们这里演示通过storyboard创建的mapView,为了方便定位和反地理编码,创建下面的成员属性:

    @property (weak, nonatomic) IBOutlet MKMapView *mapView;
    @property (strong, nonatomic) CLLocationManager *locMgr;
    @property (strong, nonatomic) CLGeocoder *gcoder;

    【地图的基本属性】

    对于地图的设置,主要有下面几个:

    ①地图类型:有标准、卫星、混合三种,默认为标准。

    // 设置地图位置
    /*
    typedef enum : NSUInteger {
    MKMapTypeStandard,
    MKMapTypeSatellite,
    MKMapTypeHybrid
    } MKMapType;
    */
    self.mapView.mapType = MKMapTypeStandard;
    ②地图追踪模式:有不追踪、追踪位置、追踪位置和方向三种,注意要完成定位授权才行。

    // 追踪位置
    /*
    typedef NS_ENUM(NSInteger, MKUserTrackingMode) {
        MKUserTrackingModeNone = 0, // the user's location is not followed
        MKUserTrackingModeFollow, // the map follows the user's location
        MKUserTrackingModeFollowWithHeading, // the map follows the user's location and heading
    }
    */
    self.mapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
    授权的代码如下,注意iOS8还要加入在info.plist中加入NSLocationAlwaysUsageDescription。

    _locMgr = [[CLLocationManager alloc] init];
    [_locMgr requestAlwaysAuthorization];
    ③地图的转动允许:默认是可以用双手转动地图的。

    // 不允许转动地图
    self.mapView.rotateEnabled = NO;
    ④地图的代理:地图的相关方法都是通过代理实现,因此设置代理十分重要。

    self.mapView.delegate = self;

    【地图的代理方法】

    ①didUpdateUserLocation,每次用户位置改变时调用。

    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation;
    MKUserLocation是用户地理位置信息的数据模型,用户在地图上是一个大头针,这个大头针的数据通过userLocation模型设置,因此通过获取和修改userLocation可以获取、改变用户位置。

    MKUserLocation中常用的属性有location、title、subtitle,location是用户位置,title和subtitle是点击用户大头针时显示的标题和副标题,需要手动设置。

    下面的代码演示了通过反地理编码获取到当前位置的城市名、位置全名显示在标题和副标题。

    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
        
        // 地图上当前位置也属于一个大头针,可以拥有标题、子标题和位置信息。
        // 大头针上的内容由模型确定,这个模型就是MKUserLocation
        // 通过修改模型属性影响大头针标题和副标题
        
        [_gcoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray *placemarks, NSError *error) {
            CLPlacemark *pm = [placemarks firstObject];
            userLocation.title = pm.addressDictionary[@"City"];
            userLocation.subtitle = pm.name;
        }];
        
    }

    除此之外,观察地图类App,打开时应当自动定位到用户的位置,用户位置改变时应当自动跟随用户。

    对于iOS8,这个功能被自动的实现,而iOS8以前需要手动设置,通过两个方法,一个用于设置当前地图的经纬跨度,一个用于设置地图的中心区域。

    注意iOS8不能再调用,否则会崩溃:

    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
        
        // 地图上当前位置也属于一个大头针,可以拥有标题、子标题和位置信息。
        // 大头针上的内容由模型确定,这个模型就是MKUserLocation
        // 通过修改模型属性影响大头针标题和副标题
        
        [_gcoder reverseGeocodeLocation:userLocation.location completionHandler:^(NSArray *placemarks, NSError *error) {
            CLPlacemark *pm = [placemarks firstObject];
            userLocation.title = pm.addressDictionary[@"City"];
            userLocation.subtitle = pm.name;
        }];
        
        // 对于iOS8以前,设置地图跨度与中心位置。
        if([[UIDevice currentDevice].systemVersion doubleValue] < 8.0){
            NSLog(@"7");
            // iOS8.0和以后会自动移动大头针
            // 移动地图到当前大头针
            [mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
            //放大地图,以便看清当前路线
            [mapView setRegion:MKCoordinateRegionMake(userLocation.location.coordinate, MKCoordinateSpanMake(0.1, 0.1)) animated:YES];
        }
        
        
    }
    ②regionWillChangeAnimated和regionDidChangeAnimated,拖动地图时会调用Will,拖动完成后调用Did方法。

    mapView中有region属性,可以获取当前地图的区域信息,例如中心点坐标、跨度:

    - (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated{
        
        NSLog(@"区域即将改变");
        
    }
    
    -(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
        
        NSLog(@"区域改变");
        NSLog(@"%f %f",self.mapView.region.span.latitudeDelta,self.mapView.region.span.longitudeDelta);
        
    }


  • 相关阅读:
    Nmap手册
    练习题,新建数据库anyun
    Centos6.5
    七丶人生苦短,我用python【第七篇】
    六丶人生苦短,我用python【第六篇】
    五、人生苦短,我用python【第五篇】
    linux 创建连接命令 ln -s 软连接
    激活phpstorm10.0.1
    php 数组合并方法
    通过jquery来实现文本框和下拉框动态添加效果,能根据自己的需求来自定义最多允许添加数量,实用的jquery动态添加文本框特效
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154122.html
Copyright © 2011-2022 走看看