iOS-系統(tǒng)原生的地圖和定位簡單使用

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)庫.


屏幕快照 2018-09-15 14.55.06.png

一塞栅、使用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

屏幕快照 2018-09-15 16.05.46.png

設置定位錨點

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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末火窒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子驮肉,更是在濱河造成了極大的恐慌熏矿,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件离钝,死亡現(xiàn)場離奇詭異票编,居然都是意外死亡,警方通過查閱死者的電腦和手機卵渴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進店門慧域,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浪读,你說我怎么就攤上這事吊趾⊥鹪#” “怎么了?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵论泛,是天一觀的道長揩尸。 經(jīng)常有香客問我,道長屁奏,這世上最難降的妖魔是什么岩榆? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮坟瓢,結(jié)果婚禮上勇边,老公的妹妹穿的比我還像新娘。我一直安慰自己折联,他們只是感情好粒褒,可當我...
    茶點故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诚镰,像睡著了一般奕坟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上清笨,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天月杉,我揣著相機與錄音,去河邊找鬼抠艾。 笑死苛萎,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的检号。 我是一名探鬼主播腌歉,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼齐苛!你這毒婦竟也來了翘盖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤脸狸,失蹤者是張志新(化名)和其女友劉穎最仑,沒想到半個月后藐俺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炊甲,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年欲芹,在試婚紗的時候發(fā)現(xiàn)自己被綠了卿啡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡菱父,死狀恐怖颈娜,靈堂內(nèi)的尸體忽然破棺而出剑逃,到底是詐尸還是另有隱情,我是刑警寧澤官辽,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布蛹磺,位于F島的核電站,受9級特大地震影響同仆,放射性物質(zhì)發(fā)生泄漏萤捆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一俗批、第九天 我趴在偏房一處隱蔽的房頂上張望俗或。 院中可真熱鬧,春花似錦岁忘、人聲如沸辛慰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帅腌。三九已至,卻和暖如春蝠筑,著一層夾襖步出監(jiān)牢的瞬間狞膘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工什乙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挽封,地道東北人。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓臣镣,卻偏偏與公主長得像辅愿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子忆某,可洞房花燭夜當晚...
    茶點故事閱讀 43,435評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1点待、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,969評論 3 119
  • 差量更新?
    YM_1閱讀 457評論 0 0
  • 晴向陽閱讀 163評論 0 0
  • 一 道 (一)檢視閱讀定義 在有限時間內(nèi)用系統(tǒng)化略讀弃舒、粗讀的方式來掌握一本書的重點的一種快速閱讀方法癞埠。 ㈡ 特點 ...
    如象閱讀 401評論 0 0
  • 時間是最寶貴的,但是時間好像總也抓不住聋呢,一晃一天又過去了……時間都去哪兒了呢苗踪?我決定對自己每天的時間花費做個詳細的...
    識得故人閱讀 516評論 0 3