iOS开发那些事-iOS6苹果地图实用开发
首先添加框架MapKit.framework。然后在工程中打开MainStoryboard.storyboard的IB设计,从对象库中拖拽Map?View到设计画面中。
调整它的位置和大小使得Map?View尽可能填出画面下面的空白部分,然后为Map?View定义输入出口。下面我们看看主视图控制器ViewController.h代码:
#import <UIKit/UIKit.h>#import <MapKit/MapKit.h>#import ”MapLocation.h” @interface ViewController : UIViewController <MKMapViewDelegate> @property (weak, nonatomic) IBOutlet UITextField *txtQueryKey; @property (weak, nonatomic) IBOutlet MKMapView *mapView; - (IBAction)geocodeQuery:(id)sender; @end
?
?
由 于使用Map?Kit?API,需要引入头文件<MapKit/MapKit.h>,头文件”MapLocation.h”是我们自己定义的 描述地图标注点类。在定义ViewController时,还需要声明实现MKMapViewDelegate协议。txtQueryKey属性是查询关 键字文本框,mapView属性是MKMapView类型,它与画面对应。点击查询按钮触发geocodeQuery:方法,它处理查询并在地图上做标 注。
下面我看看ViewController.m的viewDidLoad方法代码:
- (void)viewDidLoad{[super viewDidLoad];_mapView.mapType = MKMapTypeStandard;_mapView.delegate = self;}
?
?
在viewDidLoad方法中设置地图的类型,它的类型有3种:
MKMapTypeStandard?标注地图类型。
MKMapTypeSatellite?卫星地图类型。在卫星地图中没有街道名称等信息;
MKMapTypeHybrid?混合地图类型。在混合地图是在卫星地图上标注出街道等信息;
viewDidLoad方法的_mapView.delegate?=?self语句是当前视图控制器赋值给地图视图的delegate属性,这样地图视图在需要的时候就会回调ViewController,如果失败,回调下面的失败方法:
- (void)mapViewDidFailLoadingMap:(MKMapView *)theMapView withError:(NSError *)error {NSLog(@”error : %@”,[error description]);}
?
跟踪用户位置变化
MapKit提供了跟踪用户位置和方向变化的API,我们不用自己编写定位服务代码。开启地图视图的showsUserLocation属性,并设置方法setUserTrackingMode:就可以了,代码如下:
- (void)viewDidLoad{[super viewDidLoad];if ([CLLocationManager locationServicesEnabled]){_mapView.mapType = MKMapTypeStandard;_mapView.delegate = self;_mapView.showsUserLocation = YES;[_mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];}}
?
?
其中代码_mapView.showsUserLocation?=?YES,允许跟踪显示用户位置信息。在iOS设备中显示用户位置方式是一个发亮的蓝色小圆点。
[_mapView?setUserTrackingMode:MKUserTrackingModeFollow?animated:YES]语句设置用户跟踪模式,用户跟踪模式有3种:
MKUserTrackingModeNone?。没有用户跟踪模式;
MKUserTrackingModeFollow?。可以跟踪用户的位置变化;
MKUserTrackingModeFollowWithHeading?。可以跟踪用户的位置和方向变化;
然后,我们还需要实现地图视图委托方法mapView:didUpdateUserLocation:,它的代码如下:
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{_mapView.centerCoordinate = userLocation.location.coordinate;}
?
该委托方法在定位服务更新完成用户位置时候回调该方法,我们在该方法中重新调整地图的中心点为当前用户的中心点,其中_mapView.centerCoordinate?=?userLocation.location.coordinate语句就是实现该目的。
这几行代码就可以跟踪用户位置的变化了,但是为了这样一个小的案例拿着iPhone在外面跑一圈进行测试没有必要。可以使用模拟器测试,模拟器有几个固定的模式可以发出连续变化的数据。测试运行在画面中会有一个小圆圈,它按照我们设定的速度一直运行。