系統(tǒng)自帶API
CoreLocation
#import <CoreLocation/CoreLocation.h> 用于地理定位
CoreLocation框架使用須知
CoreLocation框架中所有數(shù)據(jù)類型的前綴都是CL
CoreLocation中使用CLLocationManager對象來做用戶定位
1.CLLocationManager
常用操作
- (void)startUpdatingLocation; //開始用戶定位
- (void) stopUpdatingLocation; //停止用戶定位
當(dāng)調(diào)用了startUpdatingLocation方法后,就開始不斷地定位用戶的位置,中途會頻繁地調(diào)用代理的下面方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
locations參數(shù)里面裝著CLLocation對象
CLLocationManager的相關(guān)屬性
//每隔多少米定位一次
@property(assign, nonatomic) CLLocationDistance distanceFilter;
//定位精確度(越精確就越耗電)
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
CLLocationManagerDelegate代理方法的簡單講解鏈接-可點(diǎn)擊
2.CLLocationCoordinate2D
是一個(gè)用來表示經(jīng)緯度的結(jié)構(gòu)體,定義如下
typedef struct {
CLLocationDegrees latitude; // 緯度
CLLocationDegrees longitude; // 經(jīng)度
} CLLocationCoordinate2D;
一般用CLLocationCoordinate2DMake函數(shù)來創(chuàng)建CLLocationCoordinate2D
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake([_latitude doubleValue],[_longitude doubleValue]);
//其中_latitude和_longitude是以字符串NSString的形式存在傳遞
3.CLLocation
用來表示某個(gè)位置的地理信息,比如經(jīng)緯度、海拔等等
//經(jīng)緯度
@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
//海拔
@property(readonly, nonatomic) CLLocationDistance altitude;
//路線,航向(取值范圍是0.0° ~ 359.9°,0.0°代表真北方向)
@property(readonly, nonatomic) CLLocationDirection course;
//行走速度(單位是m/s)
@property(readonly, nonatomic) CLLocationSpeed speed;
用下面方法可以計(jì)算2個(gè)位置之間的距離
- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
這個(gè)地方提一點(diǎn)在模擬器上,需要設(shè)置模擬位置 ,最好真機(jī)測試
帝都的經(jīng)緯度是:北緯40°,東經(jīng)116°

當(dāng)然還要注意配置info.plist文件
是否允許xxxxxxxxx訪問你的地理位置
Privacy - Location Always Usage Description //總是使用用戶位置
Privacy - Location When In Use Usage Description//使用應(yīng)用時(shí)定位
為了嚴(yán)謹(jǐn)起見,最好在使用定位功能之前判斷當(dāng)前應(yīng)用的定位功能是否可用
CLLocationManager有個(gè)類方法可以判斷當(dāng)前應(yīng)用的定位功能是否可用
+ (BOOL)locationServicesEnabled;
4.CLGeocoder
使用CLGeocoder可以完成“地理編碼”和“反地理編碼”
地理編碼:根據(jù)給定的地名,獲得具體的位置信息(比如經(jīng)緯度、地址的全稱等)
反地理編碼:根據(jù)給定的經(jīng)緯度,獲得具體的位置信息
地理編碼方法
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;
反地理編碼方法
- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;
5.CLPlacemark
CLPlacemark的字面意思是地標(biāo),封裝詳細(xì)的地址位置信息
//地理位置
@property (nonatomic, readonly) CLLocation *location;
//區(qū)域
@property (nonatomic, readonly) CLRegion *region;
//詳細(xì)的地址信息
@property (nonatomic, readonly) NSDictionary *addressDictionary;
//地址名稱
@property (nonatomic, readonly) NSString *name;
//城市
@property (nonatomic, readonly) NSString *locality;
//省/州
@property (nonatomic, readonly, copy, nullable) NSString *administrativeArea;

注意:
①.四大直轄市的城市信息無法通過CLPlacemark的locality屬性獲得,只能通過訪問administrativeArea屬性來獲得(如果locality為空,則可知為直轄市),代碼參考如下
NSString *city = placemark.locality;
if (!city) {
//四大直轄市的城市信息無法通過locality獲得,只能通過獲取省份的方法來獲得(如果city為空,則可知為直轄市)
city = placemark.administrativeArea;
}
②.上面的FormattedAddressLines可通過以下方法輸出:
NSArray *lines = _placemark.addressDictionary[@"FormattedAddressLines"];
NSString *addressString = [lines componentsJoinedByString:@"\n"];
NSLog(@"Address: %@", addressString);
③.星號表示addressDictionary里面可能沒有這個(gè)鍵和值
--------------------------- 華麗的分割線 ----------------------------
MapKit.
#import <MapKit/MapKit.h> 用于地圖展示
MKMapView
跟蹤顯示用戶的位置
設(shè)置MKMapView的userTrackingMode屬性可以跟蹤顯示用戶的當(dāng)前位置
MKUserTrackingModeNone :不跟蹤用戶的位置
MKUserTrackingModeFollow :跟蹤并在地圖上顯示用戶的當(dāng)前位置
MKUserTrackingModeFollowWithHeading :跟蹤并在地圖上顯示用戶的當(dāng)前位置,地圖會跟隨用戶的前進(jìn)方向進(jìn)行旋轉(zhuǎn)
下圖是跟蹤效果
藍(lán)色發(fā)光圓點(diǎn)就是用戶的當(dāng)前位置
藍(lán)色發(fā)光原點(diǎn),專業(yè)術(shù)語叫做“大頭針”

地圖的類型
可以通過設(shè)置MKMapView的mapViewType設(shè)置地圖類型
MKMapTypeStandard :普通地圖
MKMapTypeSatellite :衛(wèi)星云圖
MKMapTypeHybrid :普通地圖覆蓋于衛(wèi)星云圖之上
iOS9的一些新特性
//顯示指南針
self.mapView.showsCompass = YES;
//顯示比例尺
self.mapView.showsScale = YES;
//顯示交通狀況
self.mapView.showsTraffic = YES;
//顯示建筑物
self.mapView.showsBuildings = YES;
//顯示用戶所在的位置
self.mapView.showsUserLocation = YES;
//顯示感興趣的東西
self.mapView.showsPointsOfInterest = YES;
MKMapView的代理
MKMapView可以設(shè)置一個(gè)代理對象,用來監(jiān)聽地圖的相關(guān)行為
常見的代理方法有
//一個(gè)位置更改默認(rèn)只會調(diào)用一次,不斷監(jiān)測用戶的當(dāng)前位置
//每次調(diào)用,都會把用戶的最新位置(userLocation參數(shù))傳進(jìn)來
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation;
//地圖的顯示區(qū)域即將發(fā)生改變的時(shí)候調(diào)用
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;
//地圖的顯示區(qū)域已經(jīng)發(fā)生改變的時(shí)候調(diào)用
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;
MKUserLocation
MKUserLocation其實(shí)是個(gè)大頭針模型,包括以下屬性
//顯示在大頭針上的標(biāo)題
@property (nonatomic, copy) NSString *title;
//顯示在大頭針上的子標(biāo)題
@property (nonatomic, copy) NSString *subtitle;
地理位置信息(大頭針釘在什么地方?) (注意這個(gè)是只讀屬性)
@property (readonly, nonatomic) CLLocation *location;
至于自定義大頭針之后再講
通過MKMapView的下列方法,可以設(shè)置地圖顯示的位置和區(qū)域
//設(shè)置地圖的中心點(diǎn)位置
@property (nonatomic) CLLocationCoordinate2D centerCoordinate;
- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
//設(shè)置地圖的顯示區(qū)域
@property (nonatomic) MKCoordinateRegion region;
- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
MKCoordinateRegion
MKCoordinateRegion是一個(gè)用來表示區(qū)域的結(jié)構(gòu)體,定義如下
typedef struct {
CLLocationCoordinate2D center; // 區(qū)域的中心點(diǎn)位置
MKCoordinateSpan span; // 區(qū)域的跨度
} MKCoordinateRegion;
MKCoordinateSpan的定義
typedef struct {
CLLocationDegrees latitudeDelta; // 緯度跨度
CLLocationDegrees longitudeDelta; // 經(jīng)度跨度
} MKCoordinateSpan;
//設(shè)定顯示范圍
MKCoordinateSpan theSpan;
theSpan.latitudeDelta=0.01;
theSpan.longitudeDelta=0.01;
//設(shè)置地圖顯示的中心及范圍
MKCoordinateRegion theRegion;
theRegion.center=theCoordinate;
theRegion.span=theSpan;
[_mapView setRegion:theRegion];
//返回我的位置
[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
關(guān)于地圖大頭針基本操作
//添加一個(gè)大頭針
- (void)addAnnotation:(id <MKAnnotation>)annotation;
//添加多個(gè)大頭針
- (void)addAnnotations:(NSArray *)annotations;
//移除一個(gè)大頭針
- (void)removeAnnotation:(id <MKAnnotation>)annotation;
//移除多個(gè)大頭針
- (void)removeAnnotations:(NSArray *)annotations;
(id <MKAnnotation>)annotation參數(shù)是什么東西?
大頭針模型對象:用來封裝大頭針的數(shù)據(jù),比如大頭針的位置、標(biāo)題、子標(biāo)題等數(shù)據(jù)
添加大頭針
MKAnnotation *anno = [[MKAnnotation alloc] init];
anno.title = @"我是一個(gè)大頭針";
anno.subtitle = @"我有一個(gè)小弟叫小頭";
anno.coordinate = CLLocationCoordinate2DMake(40, 116);
[self.mapView addAnnotation:anno];
關(guān)于自定義大頭針有兩種思路:
一.自定大頭針模型MKAnnotation
二.自定義大頭針控件MKAnnotationView
之后專門建一篇文章講解吧
MKAnnotationView
地圖上的大頭針控件是MKAnnotationView
MKAnnotationView的屬性
//大頭針模型
@property (nonatomic, strong) id <MKAnnotation> annotation;
//顯示的圖片
@property (nonatomic, strong) UIImage *image;
//是否顯示標(biāo)注
@property (nonatomic) BOOL canShowCallout;
//標(biāo)注的偏移量
@property (nonatomic) CGPoint calloutOffset;
//標(biāo)注右邊顯示什么控件
@property (strong, nonatomic) UIView *rightCalloutAccessoryView;
//標(biāo)注左邊顯示什么控件
@property (strong, nonatomic) UIView *leftCalloutAccessoryView;
MKPinAnnotationView
MKPinAnnotationView是MKAnnotationView的子類
MKPinAnnotationView比MKAnnotationView多了2個(gè)屬性
//大頭針顏色
@property (nonatomic) MKPinAnnotationColor pinColor;
//大頭針第一次顯示時(shí)是否從天而降
@property (nonatomic) BOOL animatesDrop;
注:如果想創(chuàng)建以靜態(tài)圖片作為大頭針圖片的話,可以通過創(chuàng)建MKAnnotationView是實(shí)例。如果想使用apple自帶的大頭針則創(chuàng)建MKPinAnnotationView
MKAnnotationView 大頭針控件 是所有大頭針試圖控件的父類(可以隨意更改圖片和顏色)
MKPinAnnotationView 大頭的視圖針控件,是MKAnnotationView的子類(不能改變大頭針視圖的圖片,可以改變顏色)
iOS 系統(tǒng)自帶API地圖開發(fā)相關(guān)(一)
iOS 系統(tǒng)自帶API地圖開發(fā)相關(guān)(二)
iOS 系統(tǒng)自帶API地圖開發(fā)相關(guān)(三)
第一節(jié)到此為止.記錄下來同大家分享!!!??????
我是楚簡約,感謝您的閱讀,
喜歡就點(diǎn)個(gè)贊唄,“?喜歡”,
鼓勵(lì)又不花錢,你在看,我就繼續(xù)寫~
非簡書用戶,可以點(diǎn)右上角的三個(gè)“...”,然后"在Safari中打開”,就可以點(diǎn)贊咯~