MapKit:用于地圖展示
CoreLocation:用于地理定位
CoreLocation框架的使用
CLLocationManager
CLLocationManager的常用操作
開(kāi)始用戶定位
- (void)startUpdatingLocation;
停止用戶定位
- (void)stopUpdatingLocation;
當(dāng)調(diào)用了startUpdatingLocation方法后,就開(kāi)始不斷地定位用戶的位置绑蔫,中途會(huì)頻繁地調(diào)用代理的下面方法
- (void)locationManager:(CLLocationManager*)managerdidUpdateLocations:(NSArray*)locations;
locations參數(shù)里面裝著CLLocation對(duì)象
CLLocation
CLLocation用來(lái)表示某個(gè)位置的地理信息,比如經(jīng)緯度击孩、海拔等等
@property(readonly,nonatomic)CLLocationCoordinate2Dcoordinate;
經(jīng)緯度
@property(readonly,nonatomic)CLLocationDistancealtitude;
海拔
@property(readonly,nonatomic)CLLocationDirectioncourse;
路線,航向(取值范圍是0.0°~359.9°啦桌,0.0°代表正北方向)
@property(readonly,nonatomic)CLLocationSpeedspeed;
行走速度(單位是m/s)
用- (CLLocationDistance)distanceFromLocation:(constCLLocation*)location方法可以計(jì)算2個(gè)位置之間的距離
CLLocationManager
@property(assign,nonatomic)CLLocationDistancedistanceFilter;
每隔多少米定位一次 例如:locationManager.distanceFilter = 1000.0f;
@property(assign,nonatomic)CLLocationAccuracydesiredAccuracy;
定位精確度(越精確就越耗電)例如:desiredAccuracy=10那么精確度就是10米
CLLocationCoordinate2D
CLLocationCoordinate2D是一個(gè)用來(lái)表示經(jīng)緯度的結(jié)構(gòu)體溯壶,定義如下
typedefstruct{
CLLocationDegreeslatitude;//緯度
CLLocationDegreeslongitude;//經(jīng)度
} CLLocationCoordinate2D;
一般用CLLocationCoordinate2DMake函數(shù)來(lái)創(chuàng)建CLLocationCoordinate2D
用戶隱私的保護(hù)
開(kāi)發(fā)者可以在Info.plist中設(shè)置NSLocationUsageDescription說(shuō)明定位的目的(Privacy - Location Usage Description)
一旦用戶選擇了“Don’tAllow”,意味著你的應(yīng)用以后就無(wú)法使用定位功能
為了嚴(yán)謹(jǐn)起見(jiàn)甫男,最好在使用定位功能之前判斷當(dāng)前應(yīng)用的定位功能是否可用
CLLocationManager有個(gè)類方法可以判斷當(dāng)前應(yīng)用的定位功能是否可用
+ (BOOL)locationServicesEnabled;
CLGeocoder
使用CLGeocoder可以完成“地理編碼”和“反地理編碼”
地理編碼:根據(jù)給定的地名且改,獲得具體的位置信息(比如經(jīng)緯度、地址的全稱等)
反地理編碼:根據(jù)給定的經(jīng)緯度板驳,獲得具體的位置信息
地理編碼方法
- (void)geocodeAddressString:(NSString*)addressStringcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
反地理編碼方法
- (void)reverseGeocodeLocation:(CLLocation*)locationcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
CLGeocodeCompletionHandler
當(dāng)?shù)乩韁反地理編碼完成時(shí)又跛,就會(huì)調(diào)用CLGeocodeCompletionHandler
typedefvoid(^CLGeocodeCompletionHandler)(NSArray*placemarks,NSError*error);
這個(gè)block傳遞2個(gè)參數(shù)
error:當(dāng)編碼出錯(cuò)時(shí)(比如編碼不出具體的信息)有值
placemarks:里面裝著CLPlacemark對(duì)象
CLPlacemark
CLPlacemark的字面意思是地標(biāo),封裝詳細(xì)的地址位置信息
@property(nonatomic,readonly)CLLocation*location;
地理位置
@property(nonatomic,readonly)CLRegion*region;
區(qū)域
@property(nonatomic,readonly)NSDictionary*addressDictionary;
詳細(xì)的地址信息
@property(nonatomic,readonly)NSString*name;
地址名稱
@property(nonatomic,readonly)NSString*locality;
城市
MapKit框架的使用
跟蹤顯示用戶的位置
設(shè)置MKMapView的userTrackingMode屬性可以跟蹤顯示用戶的當(dāng)前位置
MKUserTrackingModeNone:不跟蹤用戶的位置
MKUserTrackingModeFollow:跟蹤并在地圖上顯示用戶的當(dāng)前位置
MKUserTrackingModeFollowWithHeading:跟蹤并在地圖上顯示用戶的當(dāng)前位置若治,地圖會(huì)跟隨用戶的前進(jìn)方向進(jìn)行旋轉(zhuǎn)
下圖是跟蹤效果
藍(lán)色發(fā)光圓點(diǎn)就是用戶的當(dāng)前位置
藍(lán)色發(fā)光原點(diǎn)慨蓝,專業(yè)術(shù)語(yǔ)叫做“大頭針”
地圖的類型
可以通過(guò)設(shè)置MKMapView的mapViewType設(shè)置地圖類型
MKMapTypeStandard:普通地圖(左圖)
MKMapTypeSatellite:衛(wèi)星云圖 (中圖)
MKMapTypeHybrid:普通地圖覆蓋于衛(wèi)星云圖之上
MKMapView的代理
MKMapView可以設(shè)置一個(gè)代理對(duì)象,用來(lái)監(jiān)聽(tīng)地圖的相關(guān)行為
常見(jiàn)的代理方法有
- (void)mapView:(MKMapView*)mapViewdidUpdateUserLocation:(MKUserLocation*)userLocation;
調(diào)用非常頻繁端幼,不斷監(jiān)測(cè)用戶的當(dāng)前位置
每次調(diào)用礼烈,都會(huì)把用戶的最新位置(userLocation參數(shù))傳進(jìn)來(lái)
- (void)mapView:(MKMapView*)mapViewregionWillChangeAnimated:(BOOL)animated;
地圖的顯示區(qū)域即將發(fā)生改變的時(shí)候調(diào)用
- (void)mapView:(MKMapView*)mapViewregionDidChangeAnimated:(BOOL)animated;
地圖的顯示區(qū)域已經(jīng)發(fā)生改變的時(shí)候調(diào)用
MKUserLocation
@property(nonatomic,copy)NSString*title;
顯示在大頭針上的標(biāo)題
@property(nonatomic,copy)NSString*subtitle;
顯示在大頭針上的子標(biāo)題
@property(readonly,nonatomic)CLLocation*location;
地理位置信息
設(shè)置地圖的顯示
通過(guò)MKMapView的下列方法,可以設(shè)置地圖顯示的位置和區(qū)域
設(shè)置地圖的中心點(diǎn)位置
@property(nonatomic)CLLocationCoordinate2DcenterCoordinate;
- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
設(shè)置地圖的顯示區(qū)域
@property(nonatomic)MKCoordinateRegionregion;
- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
MKCoordinateRegion
MKCoordinateRegion是一個(gè)用來(lái)表示區(qū)域的結(jié)構(gòu)體婆跑,定義如下
typedefstruct{
CLLocationCoordinate2Dcenter;//區(qū)域的中心點(diǎn)位置
MKCoordinateSpanspan;//區(qū)域的跨度
}MKCoordinateRegion;
MKCoordinateSpan的定義
typedefstruct{
CLLocationDegreeslatitudeDelta;//緯度跨度
CLLocationDegreeslongitudeDelta;//經(jīng)度跨度
}MKCoordinateSpan;
大頭針的基本操作
添加一個(gè)大頭針
- (void)addAnnotation:(id)annotation;
添加多個(gè)大頭針
-(void)addAnnotations:(NSArray*)annotations;
移除一個(gè)大頭針
- (void)removeAnnotation:(id)annotation;
移除多個(gè)大頭針
- (void)removeAnnotations:(NSArray*)annotations;
(id)annotation參數(shù)是什么東西此熬?
大頭針模型對(duì)象:用來(lái)封裝大頭針的數(shù)據(jù),比如大頭針的位置滑进、標(biāo)題犀忱、子標(biāo)題等數(shù)據(jù)
大頭針模型
新建一個(gè)大頭針模型類
#import
@interfaceMJTuangouAnnotation:NSObject
/**坐標(biāo)位置 */
@property(nonatomic,assign)CLLocationCoordinate2Dcoordinate;
/**標(biāo)題 */
@property(nonatomic,copy)NSString*title;
/**子標(biāo)題 */
@property(nonatomic,copy)NSString*subtitle;
@end
添加大頭針
MJTuangouAnnotation*anno = [[MJTuangouAnnotationalloc]init];
anno.title=@“大頭針";
anno.subtitle=@“這真的是大頭針";
anno.coordinate=CLLocationCoordinate2DMake(40,116);
[self.mapViewaddAnnotation:anno];
自定義大頭針
如何自定義大頭針
設(shè)置MKMapView的代理
實(shí)現(xiàn)下面的代理方法,返回大頭針控件
- (MKAnnotationView*)mapView:(MKMapView*)mapViewviewForAnnotation:(id)annotation;
根據(jù)傳進(jìn)來(lái)的(id)annotation參數(shù)創(chuàng)建并返回對(duì)應(yīng)的大頭針控件
代理方法的使用注意
如果返回nil扶关,顯示出來(lái)的大頭針就采取系統(tǒng)的默認(rèn)樣式
標(biāo)識(shí)用戶位置的藍(lán)色發(fā)光圓點(diǎn)阴汇,它也是一個(gè)大頭針,當(dāng)顯示這個(gè)大頭針時(shí)节槐,也會(huì)調(diào)用代理方法
因此搀庶,需要在代理方法中分清楚(id)annotation參數(shù)代表自定義的大頭針還是藍(lán)色發(fā)光圓點(diǎn)
- (MKAnnotationView*)mapView:(MKMapView*)mapViewviewForAnnotation:(id)annotation
{
//判斷annotation的類型
if(![annotationisKindOfClass:[MJTuangouAnnotationclass]])returnnil;
//創(chuàng)建MKAnnotationView
staticNSString*ID =@"tuangou";
MKAnnotationView*annoView= [mapViewdequeueReusableAnnotationViewWithIdentifier:ID];
if(annoView==nil) {
annoView= [[MKAnnotationViewalloc]initWithAnnotation:annotationreuseIdentifier:ID];
annoView.canShowCallout=YES;
}
//傳遞模型數(shù)據(jù)
annoView.annotation= annotation;
//設(shè)置圖片
MJTuangouAnnotation*tuangouAnnotation= annotation;
annoView.image= [UIImageimageNamed:tuangouAnnotation.icon];
returnannoView;
}
MKAnnotationView
地圖上的大頭針控件是MKAnnotationView
MKAnnotationView的屬性
@property(nonatomic,strong)id annotation;
大頭針模型
@property(nonatomic,strong)UIImage*image;
顯示的圖片
@property(nonatomic)BOOLcanShowCallout;
是否顯示標(biāo)注
@property(nonatomic)CGPointcalloutOffset;
標(biāo)注的偏移量
@property(strong,nonatomic)UIView*rightCalloutAccessoryView;
標(biāo)注右邊顯示什么控件
@property(strong,nonatomic)UIView*leftCalloutAccessoryView;
標(biāo)注左邊顯示什么控件
MKPinAnnotationView是MKAnnotationView的子類
MKPinAnnotationView比MKAnnotationView多了2個(gè)屬性
@property(nonatomic)MKPinAnnotationColorpinColor;
大頭針顏色
@property(nonatomic)BOOLanimatesDrop;
大頭針第一次顯示時(shí)是否從天而降