MapKit框架
MapKit框架的使用
- 导入框架 MapKit.framework
- 导入主头文件 #import
MapKit框架使用须知
- MapKit框架中所有数据类型的前缀都是MK
- MapKit有一个比较重要的UI控件:MKMapView 专门用于地图显示
注意:
使用MapKit框架,不仅要导入头文件,还要在代码里面使用框架里的某个类创建一个对象 在链接中才会真正把框架导入进来。(或者直接在Build Phases 下的Link Binary With Libraries 中直接导入MapKit框架)
否则就会出现如下错误:
Terminating app due to uncaught exception ‘NSInvalidUnarchiveOperationException’, reason: ‘Could not instantiate class named MKMapView’ 不能实例化一个对象
只要使用框架里的某个类创建了一个对象就不会报错:
MKMapView *mapView = [[MKMapView alloc] init];
地图的类型
可以通过设置MKMapView的mapType设置地图类型
MKMapTypeStandard = 0, // 普通地图
MKMapTypeSatellite, // 卫星云图
MKMapTypeHybrid, // 混合模式(普通地图覆盖于卫星云图之上)
MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0),// 3D立体卫星(iOS9)
MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0),// 3D立体混合(iOS9)
一些属性
// 是否能放大
@property (nonatomic, getter=isZoomEnabled) BOOL zoomEnabled;
// 是否能滚动
@property (nonatomic, getter=isScrollEnabled) BOOL scrollEnabled;
// 是否能旋转
// Rotate and pitch are enabled by default on Mac OS X and on iOS 7.0 and later.
@property (nonatomic, getter=isRotateEnabled) BOOL rotateEnabled NS_AVAILABLE(10_9, 7_0) __TVOS_PROHIBITED;
// 3D View
@property (nonatomic, getter=isPitchEnabled) BOOL pitchEnabled NS_AVAILABLE(10_9, 7_0) __TVOS_PROHIBITED;
// 是否缩放控制
#if !TARGET_OS_IPHONE
@property (nonatomic) BOOL showsZoomControls NS_AVAILABLE(10_9, NA);
#endif
// 是否显示指南针(右上角的)
@property (nonatomic) BOOL showsCompass NS_AVAILABLE(10_9, 9_0) __TVOS_PROHIBITED;
// 是否显示比例尺
@property (nonatomic) BOOL showsScale NS_AVAILABLE(10_10, 9_0);
@property (nonatomic) BOOL showsPointsOfInterest NS_AVAILABLE(10_9, 7_0); // Affects MKMapTypeStandard and MKMapTypeHybrid
// 是否显示建筑物
@property (nonatomic) BOOL showsBuildings NS_AVAILABLE(10_9, 7_0); // Affects MKMapTypeStandard
// 是否显示交通
@property (nonatomic) BOOL showsTraffic NS_AVAILABLE(10_11, 9_0); // Affects MKMapTypeStandard and MKMapTypeHybrid
// 是否显示用户位置
//
// Set to YES to add the user location annotation to the map and start updating its location
@property (nonatomic) BOOL showsUserLocation;
typedef NS_ENUM(NSInteger, MKUserTrackingMode) {
MKUserTrackingModeNone = 0, // 不追踪
MKUserTrackingModeFollow, // 追踪
MKUserTrackingModeFollowWithHeading __TVOS_PROHIBITED, // 带方向的追踪
} NS_ENUM_AVAILABLE(NA, 5_0) __TVOS_AVAILABLE(9_2) __WATCHOS_PROHIBITED;
// 用户追踪模式 打开地图会自动放大
@property (nonatomic) MKUserTrackingMode userTrackingMode NS_AVAILABLE(NA, 5_0);
注意:
当直接调用self.mapView.showsUserLocation = YES;直接使用的情况下不会显示用户的位置,并会报这样一个问题:
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.
请求授权。因为要显示用户的位置,得获取用户的位置,这样涉及到用户隐私,所以要授权
这样就需要导入 #import<CoreLocation/CoreLocation.h>
框架,并实例化CLLocationManager
对象
@property (nonatomic, strong) CLLocationManager *mgr;
- (CLLocationManager *)mgr
{
if (!_mgr)
{
_mgr = [[CLLocationManager alloc] init];
}
return _mgr;
}
然后授权
// 一定要这样判断一下。不然出问题崩溃
if ([self.mgr respondsToSelector:@selector(requestAlwaysAuthorization)])
{
// 点进去看注释说明
/*
* xxxxxxxxxxxxx xxxxxxxxxxxxx
* If the NSLocationAlwaysUsageDescription key is not specified in your
* Info.plist, this method will do nothing, as your app will be assumed not
* to support Always authorization.
*/
// 需要在info.plist文件配置NSLocationAlwaysUsageDescription
[self.mgr requestAlwaysAuthorization];
}