iOS工程中簡單使用原生的地圖框架
目 錄:
一却紧、使用MKMap控件
二、根據(jù)地址定位
三、在地圖上添加錨點
四渴析、導航
iOS從3.0版本開始提供了MapKit.frameword支持。該框架提供了一個可被嵌入到應用程序中的地圖視圖類MKMapView吮龄,該地圖視圖類包含一個可上下俭茧、左右滾動的地圖視圖,而且可以非常方便地在地圖中添加定制消息漓帚,并可以將其嵌入到應用程序中母债,通過編程的方式設置地圖的各種屬性(包含當前地圖顯示的區(qū)域以及用戶當前所在位置)。
iOS從4.0開始尝抖,MapKit框架支持可拖動標注和定制覆蓋層毡们。可拖動標注允許開發(fā)者以編程的方式或用戶交互方式來重定位某個標注的位置昧辽;覆蓋層則可用于創(chuàng)建有多個點組成的復雜標注衙熔,這種覆蓋層可用于創(chuàng)建公交路線、公園邊界或氣象信息(如雷達數(shù)據(jù))等搅荞。
現(xiàn)在很多的社交軟件都引入了地圖和定位功能红氯,要想實現(xiàn)這2大功能框咙,那就不得不學習其中的2個框架:MaKit和CoreLocation
(1)CoreLocation框架可以使用硬件設備來進行定位服務
×「省(2)MapKit框架能夠使應用程序做一些地圖展示與交互的相關(guān)功能
iOS定位支持的3中模式:手機基站喇嘱、WIFI、GPS
首先需要倒入兩個動態(tài)庫.
一塞栅、使用MKMapView控件
MKMapView控件中位于MapKit.framework中者铜,因此為了在iOS應用中使用該控件,需要完成兩件事情:1放椰,為該應用添加MapKit框架作烟;2,在使用MKMapView及相關(guān)類的源文件中使用“#import<MapKit/MapKit.h>”導入MapKit.framework的頭文件庄敛。本章絕大部分示例都使用了MKMapView俗壹,因此都需要執(zhí)行上面兩步操作。
#import "defind.h" ///< 通用宏
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
定義全局的地圖視圖對象和定位對象
/** 地圖對象 */
@property (nonatomic, strong) MKMapView * mapView;
/** 定位管理者 */
@property (nonatomic, strong) CLLocationManager * locationManager;
懶加載全局的地圖對象屬性
/** 懶加載地圖視圖 */
- (MKMapView *)mapView{
if (_mapView == nil) {
_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT - 100)];
/** 設置地圖類型 */
_mapView.mapType = MKMapTypeStandard;
//設置地圖可縮放
_mapView.zoomEnabled = YES;
//設置地圖可滾動
_mapView.scrollEnabled = YES;
//設置地圖可旋轉(zhuǎn)
_mapView.rotateEnabled = YES;
//設置顯示用戶顯示位置
_mapView.showsUserLocation = YES;
//為MKMapView設置delegate
_mapView.delegate = self;
}
return _mapView;
}
地圖視圖的常用屬性和方法
//區(qū)域是地圖的坐標和跨度藻烤。
//區(qū)域可以被修改绷雏,以適應視圖的高寬比,使用Region:怖亭。
@property (nonatomic) MKCoordinateRegion region;
- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
// centerCoordinate允許在不更改縮放級別的情況下更改區(qū)域的坐標涎显。
@property (nonatomic) CLLocationCoordinate2D centerCoordinate;
- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
//返回包含給定區(qū)域的地圖視圖的長寬比區(qū)域,具有相同的中心點兴猩。
- (MKCoordinateRegion)regionThatFits:(MKCoordinateRegion)region;
//進入投影坐標下的地圖可見區(qū)域期吓。
@property (nonatomic) MKMapRect visibleMapRect;
- (void)setVisibleMapRect:(MKMapRect)mapRect animated:(BOOL)animate;
//返回修改后的MKMapRect,以適應映射的高寬比倾芝。
- (MKMapRect)mapRectThatFits:(MKMapRect)mapRect;
//邊緣填充是在指定的MKMapRect周圍兩側(cè)的最小填充讨勤。
- (void)setVisibleMapRect:(MKMapRect)mapRect edgePadding:(UIEdgeInsets)insets animated:(BOOL)animate;
- (MKMapRect)mapRectThatFits:(MKMapRect)mapRect edgePadding:(UIEdgeInsets)insets;
//3D地圖用到的屬性
@property (nonatomic, copy) MKMapCamera *camera NS_AVAILABLE(10_9, 7_0);
- (void)setCamera:(MKMapCamera *)camera animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);
//*********************下面是控制可用用戶交互的類型
//默認只啟用縮放和滾動。
@property (nonatomic, getter=isZoomEnabled) BOOL zoomEnabled;
@property (nonatomic, getter=isScrollEnabled) BOOL scrollEnabled;
//在Mac OS X和iOS 7.0及更高版本上默認啟用旋轉(zhuǎn)和俯仰晨另。
@property (nonatomic, getter=isRotateEnabled) BOOL rotateEnabled NS_AVAILABLE(10_9, 7_0) __TVOS_PROHIBITED;
@property (nonatomic, getter=isPitchEnabled) BOOL pitchEnabled NS_AVAILABLE(10_9, 7_0) __TVOS_PROHIBITED;
//是否展示縮放控件
@property (nonatomic) BOOL showsZoomControls NS_AVAILABLE(10_9, NA);
//顯示指南針
@property (nonatomic) BOOL showsCompass NS_AVAILABLE(10_9, 9_0) __TVOS_PROHIBITED;
//顯示刻度比例
@property (nonatomic) BOOL showsScale NS_AVAILABLE(10_10, 9_0);
//顯示興趣點, 會影響地圖的樣式MKMapTypeStandard 和 MKMapTypeHybrid
@property (nonatomic) BOOL showsPointsOfInterest NS_AVAILABLE(10_9, 7_0);
//顯示建筑物
@property (nonatomic) BOOL showsBuildings NS_AVAILABLE(10_9, 7_0);
//顯示交通
@property (nonatomic) BOOL showsTraffic NS_AVAILABLE(10_11, 9_0);
//顯示用戶位置, 設置為YES潭千,將用戶位置注釋添加到映射并開始更新其位置
@property (nonatomic) BOOL showsUserLocation;
//表示用戶位置的注釋
@property (nonatomic, readonly) MKUserLocation *userLocation;
//用戶跟蹤模式。跟隨用戶的移動
@property (nonatomic) MKUserTrackingMode userTrackingMode NS_AVAILABLE(NA, 5_0);
- (void)setUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated NS_AVAILABLE(NA, 5_0);
//如果用戶的位置顯示在當前可見的地圖區(qū)域內(nèi)借尿,則返回YES刨晴。
@property (nonatomic, readonly, getter=isUserLocationVisible) BOOL userLocationVisible;
//注釋是用于在地圖上標注坐標的模型。 定位錨點的顯示信息, 后面有使用介紹..
//實現(xiàn)mapView:viewForAnnotation:在MKMapViewDelegate上返回每個注釋的注釋視圖路翻。
//添加錨點
- (void)addAnnotation:(id <MKAnnotation>)annotation;
- (void)addAnnotations:(NSArray<id<MKAnnotation>> *)annotations;
//移除錨點
- (void)removeAnnotation:(id <MKAnnotation>)annotation;
- (void)removeAnnotations:(NSArray<id<MKAnnotation>> *)annotations;
//當前地圖視圖中的錨點數(shù)組, 用來獲取當前地圖視圖中的所有錨點
@property (nonatomic, readonly) NSArray<id<MKAnnotation>> *annotations;
- (NSSet<id<MKAnnotation>> *)annotationsInMapRect:(MKMapRect)mapRect NS_AVAILABLE(10_9, 4_2);
//當前顯示的注釋視圖;如果未顯示注釋的視圖狈癞,則返回nil。
- (nullable MKAnnotationView *)viewForAnnotation:(id <MKAnnotation>)annotation;
//委托用于獲取可重用注釋視圖茂契,或為已注冊的類創(chuàng)建新視圖蝶桶,而不是分配新視圖。在重用池內(nèi)找可以重用的視圖,(相同的標識符)
- (nullable MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier;
//委托用于獲取可重用注釋視圖掉冶,或為已注冊的類創(chuàng)建新視圖真竖,而不是分配新視圖儡蔓。如果無法獲得視圖,則拋出異常疼邀。
- (MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier forAnnotation:(id<MKAnnotation>)annotation;
//注冊一個MKAnnotationView子類,當dequeueReusableAnnotationViewWithIdentifier:沒有要重用的視圖時實例化召锈。
- (void)registerClass:(nullable Class)viewClass forAnnotationViewWithReuseIdentifier:(NSString *)identifier NS_AVAILABLE(10_13, 11_0) __TVOS_AVAILABLE(11_0);
//選擇或取消選擇給定的注釋旁振。如果需要,請委托獲取相應的注釋視圖涨岁。
- (void)selectAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated;
- (void)deselectAnnotation:(nullable id <MKAnnotation>)annotation animated:(BOOL)animated;
@property (nonatomic, copy) NSArray<id<MKAnnotation>> *selectedAnnotations;
// annotationvisibl是當前顯示注釋視圖的可見rect拐袜。
//在mapView:didAddAnnotationViews中動畫添加注釋視圖時,委托可以使用annotationvisibl:
@property (nonatomic, readonly) CGRect annotationVisibleRect;
//定位映射梢薪,使所提供的注釋數(shù)組在最大程度上都是可見的蹬铺。
- (void)showAnnotations:(NSArray<id<MKAnnotation>> *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);
//覆蓋枚舉
typedef NS_ENUM(NSInteger, MKOverlayLevel) {
MKOverlayLevelAboveRoads = 0,//注意標簽包括盾牌和興趣點圖標。
MKOverlayLevelAboveLabels
} NS_ENUM_AVAILABLE(10_9, 7_0) __TVOS_AVAILABLE(9_2) __WATCHOS_PROHIBITED;
MKMapView的類別(OverlaysAPI)
//覆蓋是用來表示要繪制在地圖頂部的區(qū)域的模型秉撇。
//這與注釋相反甜攀,注釋表示地圖上的點。
//實現(xiàn)mapview:rendererForOverlay:在MKMapViewDelegate上為每個覆蓋返回渲染器琐馆。
//添加覆蓋
- (void)addOverlay:(id <MKOverlay>)overlay level:(MKOverlayLevel)level NS_AVAILABLE(10_9, 7_0);
- (void)addOverlays:(NSArray<id<MKOverlay>> *)overlays level:(MKOverlayLevel)level NS_AVAILABLE(10_9, 7_0);
//移除覆蓋
- (void)removeOverlay:(id <MKOverlay>)overlay NS_AVAILABLE(10_9, 4_0);
- (void)removeOverlays:(NSArray<id<MKOverlay>> *)overlays NS_AVAILABLE(10_9, 4_0);
//插入覆蓋
- (void)insertOverlay:(id <MKOverlay>)overlay atIndex:(NSUInteger)index level:(MKOverlayLevel)level NS_AVAILABLE(10_9, 7_0);
- (void)insertOverlay:(id <MKOverlay>)overlay aboveOverlay:(id <MKOverlay>)sibling NS_AVAILABLE(10_9, 4_0);
- (void)insertOverlay:(id <MKOverlay>)overlay belowOverlay:(id <MKOverlay>)sibling NS_AVAILABLE(10_9, 4_0);
//交換覆蓋
- (void)exchangeOverlay:(id <MKOverlay>)overlay1 withOverlay:(id <MKOverlay>)overlay2 NS_AVAILABLE(10_9, 7_0);
//獲取視圖上的覆蓋
@property (nonatomic, readonly) NSArray<id<MKOverlay>> *overlays NS_AVAILABLE(10_9, 4_0);
- (NSArray<id<MKOverlay>> *)overlaysInLevel:(MKOverlayLevel)level NS_AVAILABLE(10_9, 7_0);
//獲取當前覆蓋渲染器;如果沒有顯示覆蓋層规阀,返回nil。
- (nullable MKOverlayRenderer *)rendererForOverlay:(id <MKOverlay>)overlay NS_AVAILABLE(10_9, 7_0);
//當前顯示的覆蓋視圖;如果尚未創(chuàng)建視圖瘦麸,則返回nil谁撼。
//最好使用MKOverlayRenderer和-rendererForOverlay。
- (MKOverlayView *)viewForOverlay:(id <MKOverlay>)overlay NS_DEPRECATED_IOS(4_0, 7_0) __TVOS_PROHIBITED;
//這些方法隱式地操作MKOverlayLevelAboveLabels中的覆蓋滋饲,在將來的版本中可能會反對使用指定級別的方法厉碟。
- (void)addOverlay:(id <MKOverlay>)overlay NS_AVAILABLE(10_9, 4_0);
- (void)addOverlays:(NSArray<id<MKOverlay>> *)overlays NS_AVAILABLE(10_9, 4_0);
- (void)insertOverlay:(id <MKOverlay>)overlay atIndex:(NSUInteger)index NS_AVAILABLE(10_9, 4_0);
- (void)exchangeOverlayAtIndex:(NSUInteger)index1 withOverlayAtIndex:(NSUInteger)index2 NS_AVAILABLE(10_9, 4_0);
地圖視圖的代理協(xié)議方法
//位子將要改變
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;
//位置已經(jīng)改變了
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;
//地圖視圖將開始加載地圖
- (void)mapViewWillStartLoadingMap:(MKMapView *)mapView;
//地圖視圖已經(jīng)完成加載地圖
- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView;
//地圖視圖加載地圖失敗 error錯誤信息
- (void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error;
//地圖視圖將開始繪制地圖
- (void)mapViewWillStartRenderingMap:(MKMapView *)mapView NS_AVAILABLE(10_9, 7_0);
//地圖視圖已經(jīng)完成繪制地圖,
- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered NS_AVAILABLE(10_9, 7_0);
// mapView:viewForAnnotation:為每個注釋提供視圖。
//可以對所有或部分添加的注釋調(diào)用此方法屠缭。
//對于MapKit提供了注釋(例如箍鼓。返回nil以使用MapKit提供的注釋視圖。
- (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;
// mapView:didAddAnnotationViews:在在映射中添加和定位注釋視圖之后調(diào)用勿她。
//委托可以實現(xiàn)此方法來動畫添加注釋視圖袄秩。
//使用注釋視圖的當前位置作為動畫的目的地。
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray<MKAnnotationView *> *)views;
// mapView:annotationView:calloutAccessoryControlTapped:在用戶點擊左右標注附件uicontrol時調(diào)用
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control __TVOS_PROHIBITED;
//選擇注釋視圖
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view NS_AVAILABLE(10_9, 4_0);
//取消選擇注釋視圖了
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view NS_AVAILABLE(10_9, 4_0);
//地圖視圖將開始定位用戶位置
- (void)mapViewWillStartLocatingUser:(MKMapView *)mapView NS_AVAILABLE(10_9, 4_0);
//地圖視圖停止定位用戶位置
- (void)mapViewDidStopLocatingUser:(MKMapView *)mapView NS_AVAILABLE(10_9, 4_0);
//用戶的位置更新回調(diào)
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation NS_AVAILABLE(10_9, 4_0);
//有錯誤 定位用戶失敗
- (void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error NS_AVAILABLE(10_9, 4_0);
//拖動后的回調(diào), newState:新的狀態(tài), oldState:舊的狀態(tài)
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view didChangeDragState:(MKAnnotationViewDragState)newState
fromOldState:(MKAnnotationViewDragState)oldState NS_AVAILABLE(10_9, 4_0) __TVOS_PROHIBITED;
//用戶的跟蹤模式發(fā)生改變回調(diào)
- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated NS_AVAILABLE(NA, 5_0);
//覆蓋的渲染器
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay NS_AVAILABLE(10_9, 7_0);
//添加覆蓋渲染完成回調(diào)
- (void)mapView:(MKMapView *)mapView didAddOverlayRenderers:(NSArray<MKOverlayRenderer *> *)renderers NS_AVAILABLE(10_9, 7_0);
//設置覆蓋的視圖
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay NS_DEPRECATED_IOS(4_0, 7_0) __TVOS_PROHIBITED;
//設置覆蓋視圖完成回調(diào)
- (void)mapView:(MKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews NS_DEPRECATED_IOS(4_0, 7_0) __TVOS_PROHIBITED;
//返回默認MKClusterAnnotation的nil逢并,返回一個不包含給定成員注釋數(shù)組的集群注釋是不可以的之剧。
- (MKClusterAnnotation *)mapView:(MKMapView *)mapView clusterAnnotationForMemberAnnotations:(NSArray<id<MKAnnotation>>*)memberAnnotations NS_AVAILABLE(10_13, 11_0) __TVOS_AVAILABLE(11_0) __WATCHOS_PROHIBITED;
懶加載全局的定位對象
- (CLLocationManager *)locationManager{
if (_locationManager == nil) {
_locationManager = [[CLLocationManager alloc] init];
/** 導航類型 */
_locationManager.activityType = CLActivityTypeFitness;
/** 設置代理, 非常關(guān)鍵 */
_locationManager.delegate = self;
/** 想要定位的精確度, kCLLocationAccuracyBest:最好的 */
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
/** 獲取用戶的版本號 */
if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0){
[_locationManager requestAlwaysAuthorization];
}
/** 允許后臺獲取用戶位置(iOS9.0) */
if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0){
// 一定要勾選后臺模式 location updates 否者程序奔潰
_locationManager.allowsBackgroundLocationUpdates = YES;
}
}
return _locationManager;
}
CLLocationManager的常用屬性和方法
//設備定位枚舉 , 指定物理設備方向,相當于UIDeviceOrientation砍聊。
typedef NS_ENUM(int, CLDeviceOrientation) {
CLDeviceOrientationUnknown = 0,
CLDeviceOrientationPortrait,
CLDeviceOrientationPortraitUpsideDown,
CLDeviceOrientationLandscapeLeft,
CLDeviceOrientationLandscapeRight,
CLDeviceOrientationFaceUp,
CLDeviceOrientationFaceDown
};
// 表示應用程序的當前授權(quán)狀態(tài)的枚舉
typedef NS_ENUM(int, CLAuthorizationStatus) {
//用戶還沒有對這個應用程序做出選擇
kCLAuthorizationStatusNotDetermined = 0,
//本應用程序未被授權(quán)使用位置服務背稼。由于要對位置服務進行主動限制,用戶不能更改此狀態(tài)玻蝌,并可能沒有親自拒絕授權(quán)
kCLAuthorizationStatusRestricted,
//用戶已明確拒絕此應用程序的授權(quán)蟹肘,或在設置中禁用位置服務词疼。
kCLAuthorizationStatusDenied,
//用戶已授權(quán)在任何時候使用其位置,包括對區(qū)域帘腹、訪問或重大地點變化的監(jiān)測贰盗。
//這個值應該在iOS、tvOS和watchOS上使用阳欲《嬗可于MacOS,但kCLAuthorizationStatusAuthorized是同義詞和首選球化。
kCLAuthorizationStatusAuthorizedAlways NS_ENUM_AVAILABLE(10_12, 8_0),
//用戶僅在您的應用程序中授權(quán)使用其位置對他們是可見的(如果你繼續(xù)這樣做秽晚,他們就會看到在后臺接收位置更新)。授權(quán)使用尚未授予啟動api筒愚。
//這個值在MacOS上不可用赴蝇。它應該在iOS, tvOS和watchOS上使用
kCLAuthorizationStatusAuthorizedWhenInUse NS_ENUM_AVAILABLE(NA, 8_0),
//用戶已授權(quán)此應用程序使用位置服務。
//這個值在iOS巢掺、tvOS和watchOS上是不贊成或禁止的句伶。它應該用在MacOS上。
kCLAuthorizationStatusAuthorized NS_ENUM_DEPRECATED(10_6, NA, 2_0, 8_0, "Use kCLAuthorizationStatusAuthorizedAlways") __TVOS_PROHIBITED __WATCHOS_PROHIBITED = kCLAuthorizationStatusAuthorizedAlways
};
//列舉不同的活動類型址遇。這個目前影響確定何時位置更新,可能自動暫停位置更新熄阻。
typedef NS_ENUM(NSInteger, CLActivityType) {
CLActivityTypeOther = 1,
CLActivityTypeAutomotiveNavigation, //用于汽車導航
CLActivityTypeFitness, //包括任何行人活動
CLActivityTypeOtherNavigation //其他導航情況(不包括行人導航),例如船只倔约、火車或飛機的導航
};
//CLLocationManager對象是位置服務的入口點秃殉。
id _internal;
//確定用戶是否啟用了位置服務。
//如果沒有浸剩,并且您繼續(xù)調(diào)用其他CoreLocation API钾军,用戶將收到警告對話框。
//您可能希望檢查此屬性并僅在用戶明確請求時使用位置服務绢要。
+ (BOOL)locationServicesEnabled API_AVAILABLE(ios(4.0), macos(10.7));
//如果設備支持標題服務吏恭,返回YES,否則返回NO重罪。
+ (BOOL)headingAvailable API_AVAILABLE(ios(4.0), macos(10.7)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//如果設備支持重要的位置更改監(jiān)視樱哼,返回YES,否則返回NO剿配。
+ (BOOL)significantLocationChangeMonitoringAvailable API_AVAILABLE(ios(4.0), macos(10.7)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//確定設備是否支持對指定類型區(qū)域的監(jiān)視搅幅。
//如果沒有,所有監(jiān)視指定區(qū)域類型的嘗試都將失敗呼胚。
+ (BOOL)isMonitoringAvailableForClass:(Class)regionClass API_AVAILABLE(ios(7.0), macos(10.10)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//區(qū)域監(jiān)測是否可用, 已經(jīng)棄用的方法茄唐。使用+ isMonitoringAvailableForClass:代替。
+ (BOOL)regionMonitoringAvailable API_DEPRECATED_WITH_REPLACEMENT("+isMonitoringAvailableForClass:", ios(4.0, 7.0), macos(10.8, 10.10)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//是否啟用了區(qū)域監(jiān)測, 棄用蝇更。使用+isMonitoringAvailableForClass:和+authorizationStatus代替沪编。
+ (BOOL)regionMonitoringEnabled API_DEPRECATED("Use +isMonitoringAvailableForClass: and +authorizationStatus instead", ios(4.0, 6.0), macos(10.8, 10.10)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//確定設備是否支持測距呼盆。
//如果沒有,所有發(fā)射信標的嘗試都將失敗蚁廓。
+ (BOOL)isRangingAvailable API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//查看調(diào)用應用程序的當前授權(quán)狀態(tài)访圃。
+ (CLAuthorizationStatus)authorizationStatus API_AVAILABLE(ios(4.2), macos(10.7));
//定位的代理對象
@property(assign, nonatomic, nullable) id<CLLocationManagerDelegate> delegate;
//啟用定位服務, 棄用。使用+ locationServicesEnabled代替相嵌。
@property(readonly, nonatomic) BOOL locationServicesEnabled API_DEPRECATED_WITH_REPLACEMENT("+locationServicesEnabled", ios(2.0, 4.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//允許應用程序指定在其應用程序中使用的位置將與標準位置權(quán)限對話框一起顯示挽荠。
//這個屬性需要是在調(diào)用startUpdatingLocation之前設置。
//棄用平绩。在Info中設置目的字符串。plist使用關(guān)鍵NSLocationUsageDescription漠另。
@property(copy, nonatomic, nullable) NSString *purpose API_AVAILABLE(macos(10.7)) API_DEPRECATED("Set the purpose string in Info.plist using key NSLocationUsageDescription", ios(3.2, 6.0)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//指定用戶活動的類型捏雌。當前影響的行為如
//確定何時可以自動暫停位置更新。
//默認情況下笆搓,使用CLActivityTypeOther性湿。
@property(assign, nonatomic) CLActivityType activityType API_AVAILABLE(ios(6.0), watchos(4.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED;
//指定以米為單位的最小更新距離÷埽客戶將不會被通知移動較少高于所述值肤频,
//除非精確度有所提高。通過kCLDistanceFilterNone通知所有動作算墨。
//默認情況下宵荒,使用kCLDistanceFilterNone。
@property(assign, nonatomic) CLLocationDistance distanceFilter;
//所需的定位精度净嘀。定位服務將盡其所能你期望的準確性报咳。
//然而,這并不能保證挖藏。優(yōu)化電源性能暑刃,請確保為您的使用場景指定適當?shù)木?//(例如,當只需要一個粗糙的位置時膜眠,使用一個較大的精度值)岩臣。
//使用kCLLocationAccuracyBest達到最佳的準確度。
//使用kCLLocationAccuracyBestForNavigation進行導航宵膨。
//默認值因平臺而異架谎。
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
//指定位置更新可以在可能的情況下自動暫停。
//默認情況下柄驻,對于與iOS 6.0或更高版本鏈接的應用程序狐树,這是肯定的。
@property(assign, nonatomic) BOOL pausesLocationUpdatesAutomatically API_AVAILABLE(ios(6.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//允許后臺位置更新
//默認情況下鸿脓,這是不適用于iOS 9.0或更高版本的應用程序抑钟,
//帶有uibackgroundmode的設置涯曲,在Info中包含"location"。
//plist,你必須設置否者程序舊崩潰
//還可以在運行時調(diào)用時將此屬性設置為YES, 提高性能
//開啟位置更新 -startUpdatingLocation 意圖在后臺繼續(xù)定位在塔。
//當uibackgroundmode不包含時幻件,將此屬性設置為YES
//將此屬性重置為NO等同于省略“l(fā)ocation”
// UIBackgroundModes值。仍然允許訪問位置當應用程序正在運行時(即沒有暫停)蛔溃,
//并且已經(jīng)運行足夠的授權(quán)(即它在使用授權(quán)時已經(jīng)存在使用绰沥,或它總是有授權(quán))。
//然而贺待,這款應用仍然是遵守通常的任務暫停規(guī)則徽曲。
//參見-requestWhenInUseAuthorization and -requestAlwaysAuthorization for
//關(guān)于可能的授權(quán)值的更多細節(jié)。
@property(assign, nonatomic) BOOL allowsBackgroundLocationUpdates API_AVAILABLE(ios(9.0), watchos(4.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED;
//顯示后臺定位的指示器
//指定應用程序使用continuous時顯示一個指示器后臺位置更新麸塞。
//起動連續(xù)背景位置更新要求app設置uibackgroundmode加入"location"
//并將屬性allowsBackgroundLocationUpdates設置為YES之前
//調(diào)用-startUpdatingLocation秃臣,目的是繼續(xù)在后臺定位。
//請注意哪工,此屬性僅適用于始終具有授權(quán)的應用程序奥此。
//對于授權(quán)使用的應用程序,在何時顯示指示符使用持續(xù)的后臺位置更新雁比,
//以維護用戶可見性和應用程序仍然在使用稚虎。
//此屬性的默認值為NO。
@property(assign, nonatomic) BOOL showsBackgroundLocationIndicator API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//定位位置
//收到的最后一個位置偎捎。將為nil蠢终,直到接收到位置
@property(readonly, nonatomic, copy, nullable) CLLocation *location;
//標題, 棄用。使用+ headingAvailable代替茴她。
@property(readonly, nonatomic) BOOL headingAvailable API_DEPRECATED_WITH_REPLACEMENT("+headingAvailable", ios(3.0, 4.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//標題過濾器
//指定標題服務更新所需的最小程度更改量蜕径。
//客戶不會更新的通知少于規(guī)定的過濾值。
//通過kCLHeadingFilterNone通知所有更新败京。
//默認情況下兜喻,使用1度。
@property(assign, nonatomic) CLLocationDegrees headingFilter API_AVAILABLE(ios(3.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//指定要引用的標題計算的物理設備方向赡麦。默認情況下,
//使用CLDeviceOrientationPortrait朴皆。
//CLDeviceOrientationUnknown CLDeviceOrientationFaceUp,CLDeviceOrientationFaceDown被忽略。
@property(assign, nonatomic) CLDeviceOrientation headingOrientation API_AVAILABLE(ios(4.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//返回收到的最新標題更新泛粹,如果沒有可用的遂铡,返回nil。
@property(readonly, nonatomic, copy, nullable) CLHeading *heading API_AVAILABLE(ios(4.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//框架能夠支持的最大區(qū)域大小(以距離中心點的距離為單位)晶姊。
//試圖注冊一個比這個更大的區(qū)域會導致kclerrorregional monitoringfailure扒接。
//此值可能根據(jù)設備的硬件特性以及動態(tài)變化的資源約束而變化。
@property (readonly, nonatomic) CLLocationDistance maximumRegionMonitoringDistance API_AVAILABLE(ios(4.0), macos(10.8)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//檢索當前被監(jiān)視區(qū)域的一組對象。如果有位置管理器
//已被指示監(jiān)視某個區(qū)域钾怔,在此或之前啟動應用程序期間碱呼,它將監(jiān)視該區(qū)域
//出現(xiàn)在本集合內(nèi)。
@property (readonly, nonatomic, copy) NSSet<__kindof CLRegion *> *monitoredRegions API_AVAILABLE(ios(4.0), macos(10.8)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//檢索一組對象宗侦,這些對象表示此位置管理器積極為其提供范圍愚臀。
@property (readonly, nonatomic, copy) NSSet<__kindof CLRegion *> *rangedRegions API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//When +authorizationStatus == kCLAuthorizationStatusNotDetermined,
//調(diào)用此方法將觸發(fā)“在使用中”請求提示用戶授權(quán)矾利。
//如果可能姑裂,執(zhí)行響應調(diào)用引導用戶請求基于位置的服務,使其原因因為提示會很清楚男旗。
//由于以下原因而導致的任何授權(quán)更改提示將通過通常的委托回調(diào)反映:
// locationmanager:didChangeAuthorizationStatus:舶斧。
//如果收到,“在使用中”授權(quán)授予對用戶的訪問權(quán)限位置通過-startUpdatingLocation/-startRangingBeaconsInRegion察皇,
//而在前景捧毛。如果更新已經(jīng)開始時,去后臺让网,然后一個狀態(tài)欄橫幅將顯示維護用戶可見性,更新將繼續(xù)师痕,直到停止
//通常情況下溃睹,或應用程序被用戶殺死。
//“在使用中”授權(quán)不啟用區(qū)域上的監(jiān)測API胰坟,
//重要的位置變化因篇,或訪問,和-startUpdatingLocation將從后臺調(diào)用不會成功笔横。
//When +authorizationStatus
//通常在第一次調(diào)用之后)這個方法不會做任何事情竞滓。
//NSLocationWhenInUseUsageDescription鍵必須在你的Info.plist;
//否則,這個方法什么都不做吹缔,就像你的應用程序一樣假定在使用授權(quán)時不支持。
- (void)requestWhenInUseAuthorization API_AVAILABLE(ios(8.0)) API_UNAVAILABLE(macos);
//When +authorizationStatus == kCLAuthorizationStatusNotDetermined,調(diào)用此方法將觸發(fā)“總是”請求提示用戶授權(quán)鹃彻。
//如果可能侈询,執(zhí)行響應調(diào)用引導用戶請求基于位置的服務,使其知道原因,因為提示會很清楚晚碾。
//由于以下原因而導致的任何授權(quán)更改提示將通過通常的委托回調(diào)反映:locationmanager:didChangeAuthorizationStatus:抓半。
//如果收到,“總是”授權(quán)授予對用戶的訪問權(quán)限通過任何CLLocationManager API定位格嘁,并授予訪問權(quán)限可發(fā)射的監(jiān)測API笛求,例如地理會議/區(qū)域監(jiān)測,重要的位置訪問,等探入。
//即使被用戶殺死狡孔,啟動受監(jiān)測區(qū)域或訪問模式觸發(fā)的事件將導致a重新啟動。
//“始終”授權(quán)對用戶隱私構(gòu)成重大風險因此新症,除非后臺啟動行為步氏,否則不鼓勵請求確實是必需的。
//不要調(diào)用+requestAlwaysAuthorization徒爹,除非你認為用戶會感謝你這樣做荚醒。
//目前有“使用時”授權(quán)的應用程序以前從未要求“總是”授權(quán)可以使用此方法只請求“總是”授權(quán)一次。
//否則,如果 +authorizationStatus通常在第一次調(diào)用之后)這個方法不會做任何事情隆嗅。
//兩個nslocationalways sandwhenuseusagedescription和NSLocationWhenInUseUsageDescription鍵必須在你的Info.plist;
//否則界阁,這個方法什么都不做,就像你的應用程序一樣假設不始終支持授權(quán)胖喳。
- (void)requestAlwaysAuthorization API_AVAILABLE(ios(8.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED;
//開始更新位置
- (void)startUpdatingLocation API_AVAILABLE(watchos(3.0)) __TVOS_PROHIBITED;
//停止更新位置
- (void)stopUpdatingLocation;
//請求單個位置更新泡躯。
//本服務將根據(jù)準確的位置進行定位達到要求的精確度。
//位置更新將被交付通過標準委托回調(diào)丽焊,即locationManager:didUpdateLocations:
//如果可用的最佳位置精度較低较剃,則為超時后通過標準委托回調(diào)傳遞。
//如果無法確定位置技健,locationManager:didFailWithError:委托回調(diào)將以未知的錯誤位置交付写穴。
//只有一個未完成的位置請求,此方法可以不得與startUpdatingLocation或allowDeferredLocationUpdates雌贱。
//調(diào)用這些方法中的任何一個都會立即取消位置請求啊送。該方法可以使用stopUpdatingLocation顯式取消請求。
- (void)requestLocation API_AVAILABLE(ios(9.0)) API_UNAVAILABLE(macos);
//開始更新標題
- (void)startUpdatingHeading API_AVAILABLE(ios(3.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//停止更新標題
- (void)stopUpdatingHeading API_AVAILABLE(ios(3.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//立即取消航向校準
- (void)dismissHeadingCalibrationDisplay API_AVAILABLE(ios(3.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//開始監(jiān)視重要的位置變化欣孤。此服務的行為不受所需精確度的影響或距離過濾器屬性馋没。
//位置將通過與標準相同的委托回調(diào)傳遞位置服務。
- (void)startMonitoringSignificantLocationChanges API_AVAILABLE(ios(4.0), macos(10.7)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//停止監(jiān)視重要的位置變化
- (void)stopMonitoringSignificantLocationChanges API_AVAILABLE(ios(4.0), macos(10.7)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//開始監(jiān)視指定的區(qū)域降传。設計精度表示穿過該地區(qū)邊界的距離該申請書希望獲通知該區(qū)域邊界已越過篷朵。
//這有助于預防當使用者在該區(qū)域的邊界時,會有重復的通知婆排。
//這一價值將得到最大限度的尊重款票,如果要求的精確度相對于區(qū)域的大小較大,或者設備的尺寸不高泽论,則可能不受尊重能夠提供所需的精度艾少。
//如果該應用程序已經(jīng)監(jiān)視了具有相同標識符的相同類型的區(qū)域,那么它將被監(jiān)視從監(jiān)視中刪除翼悴。
//這是異步進行的缚够,可能不會立即反映在monitoredRegions幔妨。
- (void)startMonitoringForRegion:(CLRegion *)region
desiredAccuracy:(CLLocationAccuracy)accuracy API_DEPRECATED_WITH_REPLACEMENT("-startMonitoringForRegion:", ios(4.0, 6.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//停止監(jiān)控指定區(qū)域。調(diào)用stopMonitoringForRegion是有效的:對于已注冊的區(qū)域用于在此或之前啟動應用程序期間使用不同的location manager對象進行監(jiān)視谍椅。
//這是異步進行的误堡,可能不會立即反映在monitoredRegions。
- (void)stopMonitoringForRegion:(CLRegion *)region API_AVAILABLE(ios(4.0), macos(10.8)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//開始監(jiān)視指定的區(qū)域雏吭。
//若本應用程式已監(jiān)察同一類型及同一標識符的區(qū)域锁施,將從監(jiān)視中刪除。
//對于循環(huán)區(qū)域杖们,區(qū)域監(jiān)測服務將優(yōu)先考慮按面積劃分的地區(qū)悉抵,傾向于較小的地區(qū)而不是較大的地區(qū)。
//這是異步進行的摘完,可能不會立即反映在monitoredRegions姥饰。
- (void)startMonitoringForRegion:(CLRegion *)region API_AVAILABLE(ios(5.0), macos(10.8)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//異步檢索指定區(qū)域的緩存狀態(tài)。狀態(tài)通過以下方式返回給委托 locationManager:didDetermineState:forRegion:孝治。
- (void)requestStateForRegion:(CLRegion *)region API_AVAILABLE(ios(7.0), macos(10.10)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//開始計算指定區(qū)域內(nèi)信標的范圍
- (void)startRangingBeaconsInRegion:(CLBeaconRegion *)region API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//停止指定區(qū)域的計算范圍
- (void)stopRangingBeaconsInRegion:(CLBeaconRegion *)region API_AVAILABLE(ios(7.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//表示應用程序?qū)⒃试S位置管理器延遲執(zhí)行位置更新列粪,直到滿足退出條件。
//這可能使設備進入低功耗狀態(tài)谈飒,稍后更新交貨岂座。
//一旦滿足退出條件,位置管理器就會繼續(xù)正常更新杭措,直到再次調(diào)用此方法费什。
//退出條件、距離和超時瓤介,可以使用常量指定cllocationdistancemax和CLTimeIntervalMax,如果你是的話試圖達到無限的距離或超時赘那。
//CLLocationManagerDelegate將繼續(xù)接收正常的更新只要應用程序仍然在前臺刑桑。
//在這個過程中在后臺,設備可能會進入低功耗狀態(tài)指定距離和時間間隔的部分募舟。而在這狀態(tài)祠斧,地點將合并,以便稍后交付拱礁。
//位置更新將被推遲盡可能多的合理保存力量琢锋。如果另一個進程正在使用位置,設備可能不會進入a低功耗狀態(tài)呢灶,更新將正常進行吴超。遞延如果設備退出和重新進入低功率狀態(tài)。
//所有位置更新鸯乃,包括延遲更新鲸阻,將通過委托回調(diào)locationManager:didUpdateLocations:當延遲更新結(jié)束時,管理器將調(diào)用委托調(diào)locationManagerDidFinishDeferredUpdates:withError:。一個錯誤如果經(jīng)理不延遲更新和退出鸟悴,將返回沒有達到標準陈辱。
- (void)allowDeferredLocationUpdatesUntilTraveled:(CLLocationDistance)distance
timeout:(NSTimeInterval)timeout API_AVAILABLE(ios(6.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//如果先前已啟用,則不允許延遲位置更新细诸。任何優(yōu)秀的將發(fā)送更新信息沛贪,并恢復定期的位置更新。
- (void)disallowDeferredLocationUpdates API_AVAILABLE(ios(6.0)) API_UNAVAILABLE(macos) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
//如果設備支持延遲位置更新震贵,返回YES利赋,否則返回NO
+ (BOOL)deferredLocationUpdatesAvailable API_AVAILABLE(ios(6.0), macos(10.9)) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
添加視圖設置代理
//添加地圖視圖到控制器
[self.view addSubview:self.mapView];
/** 申請授權(quán), AlwaysAuthorization:永久授權(quán) */
[self.locationManager requestAlwaysAuthorization];
/** 開始更新位置信息, 調(diào)用這個方法后, 才有代理回調(diào) */
[self.locationManager startUpdatingLocation];
地址解析方法
/** 地址解析, 把地址字符串轉(zhuǎn)成坐標值 */
- (void)geocodingAddress{
/** 把省會的名字做地址解析 */
CLGeocoder * coder = [[CLGeocoder alloc] init];
[coder geocodeAddressString:self.locationString completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
CLPlacemark * placemark = placemarks.lastObject;
CLLocationCoordinate2D coor = placemark.location.coordinate;
/** 回到主線程刷新UI界面 */
dispatch_async(dispatch_get_main_queue(), ^{
/** 設置當前位置的圖釘, MKPointAnnotation:采用MKAnnotation協(xié)議的對象, pinView:系統(tǒng)圖釘 */
MKPointAnnotation * point = [[MKPointAnnotation alloc] init];
point.coordinate = coor;
/** 添加??點, 這個方法會調(diào)用下面的 設置錨點視圖 */
[self.mapView addAnnotation:point];
/** 將地圖的顯示區(qū)域變小 */
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(coor, 1000, 1000);
[self.mapView setRegion:region animated:YES];
});
}];
}
定位的代理回調(diào)
#pragma mark - 定位代理
/** 更新位置信息后的回調(diào), 這個方法會重覆調(diào)用 */
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
/** 獲取到當前位置 */
CLLocation * currLocation = locations.lastObject;
/** 設置當前位置的圖釘, MKPointAnnotation:采用MKAnnotation協(xié)議的對象, pinView:系統(tǒng)圖釘 */
MKPointAnnotation * point = [[MKPointAnnotation alloc] init];
point.coordinate = currLocation.coordinate;
/** 位置信息, 地址反向解析, 得到位置的名稱 */
CLGeocoder * coder = [[CLGeocoder alloc] init];
[coder reverseGeocodeLocation:currLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
CLPlacemark * placemark = placemarks.lastObject;
point.title = [NSString stringWithFormat:@"當前:%@", placemark.name];
}];
/** 添加圖釘, 這個方法會調(diào)用下面的 代理方法 */
[self.mapView addAnnotation:point];
/** 將地圖的顯示區(qū)域變小 */
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(currLocation.coordinate, 1000, 1000);
[self.mapView setRegion:region animated:YES];
}
地圖代理回調(diào)
#pragma mark - 地圖代理
/** 設置錨點視圖 */
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
MKPinAnnotationView * pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"pinView"];
if (pinView == nil) {
pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pinView"];
}
pinView.animatesDrop = YES;
pinView.canShowCallout = YES;
return pinView;
}
//注意:只要是想后臺獲取用戶的位置,就必須開啟后臺模式
項目->TARGETS->Capabilities-> Background Modes 勾線 Location updates
設置定位錨點
1./指定地圖顯示中心和顯示區(qū)域
為了控制地圖顯示指定區(qū)域,只要兩步即可屏歹。
1隐砸、創(chuàng)建一個MKCoordinateRegion結(jié)構(gòu)體變量,該結(jié)構(gòu)體變量包含center蝙眶,span兩個成員季希,其中center控制顯示區(qū)域的中心,span控制顯示區(qū)域的范圍幽纷。
2式塌、將MKMapView的region屬性設為制定的MKCoordinateRegion結(jié)構(gòu)體變量。
iOS中為開發(fā)者提供了以下三種地圖類型友浸,開發(fā)者可以通過設置MKMapView的mapViewType設置地圖類型峰尝。
(1)MKMapTypeStandard 普通地圖
∈栈帧(2)MKMapTypeSatellite 衛(wèi)星云圖
∥溲А(3)MKMapTypeHybrid 普通地圖覆蓋于衛(wèi)星云圖之上
2./在地圖中使用大頭針
(1)通過MapView的addAnnotation方法可以添加一個大頭針到地圖上
÷滓狻(2)通過MapView的addAnnotations方法可以添加多個大頭針到地圖上
- (void)addAnnotation:(id <MKAnnotation>)annotation;
說明:需要傳入一個遵守了MKAnnotation協(xié)議的對象(下面代碼中進行演示)
/** 添加圖釘, 這個方法會調(diào)用下面的 代理方法 */
[self.mapView addAnnotation:point];
當你調(diào)用了- (void)addAnnotation:(id <MKAnnotation>)annotation;后系統(tǒng)會自動調(diào)用下面的回調(diào)
可以在下面的代理方法中實現(xiàn)自定義的圖釘樣式
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
static NSString *ID = @"anno";
MKPinAnnotationView *annoView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];
if (annoView == nil) {
annoView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];
// 顯示氣泡
annoView.canShowCallout = YES;
// 設置綠色
annoView.pinColor = MKPinAnnotationColorGreen;
}
return annoView;
}