—在地圖的定位中遇到 的問題(1.http://blog.csdn.net/m372897500/article/details/50770927數組
2.http://www.jianshu.com/p/217f041eeb24緩存
3.大衆點評是開放API 的,作團購能夠去查閱Api服務器
)app
************************************************************************************************************異步
1.沒法地圖定位管理代理方法 post
這兩個新增的方法致使,以前寫的程序在iOS8運行會出現,定位功能沒法正常使用動畫
這樣讓iOS8正常使用定位功能呢?編碼
<1>你須要在info.plist表裏面添加兩條變量spa
在Info.plist中加入兩個缺省沒有的字段.net
這兩個字段沒什麼特別的意思,就是自定義提示用戶受權使用地理定位功能時的提示語。
手動請求:
_instance.locationManager = [[CLLocationManager alloc] init];//建立位置管理器
_instance.locationManager.delegate=_instance;
_instance.locationManager.desiredAccuracy=kCLLocationAccuracyBest;//設置爲精準定位
_instance.locationManager.distanceFilter=100.0f;//定位距離過濾器
_instance.updating=NO;
//定位服務是否可用
BOOL enable=[CLLocationManager locationServicesEnabled];
//是否具備定位權限
int status=[CLLocationManager authorizationStatus];
if(!enable || status<3){
//請求權限
[_instance.locationManager requestWhenInUseAuthorization];
}
在看看authorizationStatus的枚舉吧
typedef NS_ENUM(int, CLAuthorizationStatus) {
// 用戶從未選擇過權限
kCLAuthorizationStatusNotDetermined = 0,
// 沒法使用定位服務,該狀態用戶沒法改變
kCLAuthorizationStatusRestricted,
// 用戶拒絕該應用使用定位服務,或是定位服務總開關處於關閉狀態
kCLAuthorizationStatusDenied,
// 這個值已棄用
kCLAuthorizationStatusAuthorized // 大體是用戶容許該程序不管什麼時候均可以使用地理信息
kCLAuthorizationStatusAuthorizedAlways // 大體是用戶贊成程序在可見時使用地理位置
kCLAuthorizationStatusAuthorizedWhenInUse
};
*************************************************************************** /*CLPlacemark :(屬性)
//NSDictionary *addressDictionary //屬性,遍歷字典數據
NSString *name; // 地名
NSString *thoroughfare; //街道
NSString *subThoroughfare; //街道和相關的信息,例如門診等
NSString *locality; //城市
NSString *subLocality; //城市相關信息,好比標誌性建築
NSString *administrativeArea; //直轄市,省
NSString *subAdministrativeArea; // 直轄市相關信息
NSString *postalCode; //郵編
NSString *ISOcountryCode;//國家郵編
NSString *country; // 國家
NSString *inlandWater; //水潭,湖泊
NSString *ocean; //海洋
NSArray *areasOfInterest;//關聯或相關性地標
*/
***************************************************************************
設置系統的大頭針樣式 (記得添加大頭針的時候記得遵照代理MKAnnotation)
/**
*設置大頭針視圖的樣式
*annotation:大頭針
*return:nil(設置位系統默認的大頭針樣式,默認annotationView 是不可見的,要想可見換成 MKPinAnnotationView)
//區別:若是想建立以靜態圖片做爲大頭針圖片的話,能夠經過建立MKAnnotationView是實例。若是想使用apple自帶的大頭針則建立MKPinAnnotationView
*/
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
//若是是用戶的當前的位置,這返回空,使用系統的大頭針
if([annotation isKindOfClass:[MKUserLocation class]])return nil;
//設置標誌符
static NSString *ID = @"annotation";
//從緩衝池裏取出大頭針
MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];
//若是爲空,設置大頭針
if (annotationView == nil) {
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:ID];
//設置大頭針的屬性(標題和子標題)能夠顯示
annotationView.canShowCallout = YES;
//設置MKPinAnnotationView 大頭針的顏色
annotationView.pinColor = MKPinAnnotationColorPurple;
//設置MKPinAnnotationView 的掉落效果
annotationView.animatesDrop = YES;
}
annotationView.annotation = annotation;
return annotationView;
}
***************************************************************************
/**
*設置大頭針視圖的樣式
*annotation:大頭針
*return:nil(設置位系統默認的大頭針樣式,默認annotationView 是不可見的,要想可見換成 MKPinAnnotationView)
//區別:若是想建立以靜態圖片做爲大頭針圖片的話,能夠經過建立MKAnnotationView是實例。若是想使用apple自帶的大頭針則建立MKPinAnnotationView
*/
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
//若是是用戶的當前的位置,這返回空,使用系統的大頭針
if([annotation isKindOfClass:[MKUserLocation class]])return nil;
static NSString *ID = @"annotationView";
//從緩存池中取
MyAnnotationView *myAnnotationView = (MyAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];
//判斷是否爲空
if (myAnnotationView == nil) {
myAnnotationView = [[MyAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:ID];
//顯示出繼承MKAnnotationView 的 大頭針 canShowCallout 顯示(標題和子標題)出內容
myAnnotationView.canShowCallout = YES;
// myAnnotationView.image = [UIImage imageNamed:@"gps_13"];
//設置大頭針的左右兩邊的按鈕
myAnnotationView.leftCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
myAnnotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
}
MyAnnotation *anno = (MyAnnotation *)annotation;
myAnnotationView.image = [UIImage imageNamed:anno.icon];
//系統默認已經調用了
// myAnnotationView.annotation = annotation;
return myAnnotationView;
}
#pragma mark MKAnnotation 代理
//設置annotationView 已經添加,在這裏設置顯示的過程,
//views:全部的annotationView ,設置它的動畫
-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
for (MKAnnotationView *annoView in views) {
//判斷是否爲用戶位置的大頭針,是的話不設置動畫
if ([annoView.annotation isKindOfClass:[MKUserLocation class]])return;
//保存原來的views的位置
CGRect endFrame = annoView.frame;
//改變原來的位置
annoView.frame = CGRectMake(endFrame.origin.x, 0, endFrame.size.width, endFrame.size.height);
[UIView animateWithDuration:0.5 animations:^{
annoView.frame = endFrame;
}];
}
}
在iOS 8 之前的若是使用storyBoard 使用 mapView 就要使用mapKit
***************************************************************************
//打開手機的官方地圖進行導航
- (IBAction)navigate {
//獲取目的地
NSString *destination = self.destinationField.text;
if (destination.length == 0) return;
//2.進行地理編碼
CLGeocoder *gecode = [[CLGeocoder alloc] init];
[gecode geocodeAddressString:destination completionHandler:^(NSArray *placemarks, NSError *error) {
if (placemarks.count == 0 || error ) return ;
//2.1獲取目的地地標
CLPlacemark *clpm = [placemarks firstObject];
//2.2經過CLPlacemark(地標)獲取MKPlacemark
MKPlacemark *ckpm = [[MKPlacemark alloc] initWithPlacemark:clpm];
//2.3經過MKPlacemark獲取目的地的MKMapItem
MKMapItem *destinationItem = [[MKMapItem alloc] initWithPlacemark:ckpm];
//2.3獲取起始地(出發地)的位置
MKMapItem *sourceItem = [MKMapItem mapItemForCurrentLocation];
//2.4開始導航
[self startNavigateWithSourceItem:sourceItem destinationItem:destinationItem];
}];
}
/**
*開始導航
*1.startNavigateWithSourceItem:出發地
*2.destinationItem:目的地
*/
-(void)startNavigateWithSourceItem:(MKMapItem *)sourceItem destinationItem:(MKMapItem *)destinationItem
{
//將起點和終點放入數組中
NSArray *item = @[sourceItem,destinationItem];
//設置launchOptions 的選項字典
NSDictionary *lauchOptions = @{
MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,
MKLaunchOptionsMapTypeKey:@(MKMapTypeStandard),
MKLaunchOptionsShowsTrafficKey:@YES
};
[MKMapItem openMapsWithItems:item launchOptions:lauchOptions];
}
*********************************
導航劃線:http://blog.csdn.net/jianjianyuer/article/details/19568167
- (void)viewDidLoad {
[super viewDidLoad];
//設置顯示的區域的中心
self.mapview.delegate = self;
CLLocationCoordinate2D coordinate ={45.748637,126.699891};
MKCoordinateSpan span = MKCoordinateSpanMake(0.09, 0.09);
MKCoordinateRegion region = MKCoordinateRegionMake(coordinate, span);
[self.mapview setRegion:region];
[self.mapview regionThatFits:region];//設置兼容性
//設置第一個地點
CLLocationCoordinate2D redCoordinate = CLLocationCoordinate2DMake(45.748637, 126.699891);
MKPlacemark *ckpm = [[MKPlacemark alloc]initWithCoordinate:redCoordinate addressDictionary:nil];
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:ckpm];
mapItem.name = @"red rocks";
//設置第一個地點
CLLocationCoordinate2D coordinate2 = CLLocationCoordinate2DMake(45.747747, 126.658671);
//MKPlacemark表明地圖上的實際位置,也就是它的經緯度
MKPlacemark *ckpm2 = [[MKPlacemark alloc] initWithCoordinate:coordinate2 addressDictionary:nil];
MKMapItem *mapItem2 = [[MKMapItem alloc] initWithPlacemark:ckpm2];
mapItem2.name =@"sports authority";
//設置畫線的方向
[self findDirector:mapItem to:mapItem2];
}
-(void)findDirector:(MKMapItem *)source to:(MKMapItem *)destination
{
//請求方向指南,須要兩個地圖上的實際位置
MKDirectionsRequest *request =[[MKDirectionsRequest alloc] init];
request.source = source;
request.destination = destination;
// RequestsAlternateRoutes。若是路由服務器能夠找出多條合理的路線,設置YES將會返回全部路線。不然,只返回一條路線。
request.requestsAlternateRoutes = NO;
//請求路線
MKDirections *direction = [[MKDirections alloc] initWithRequest:request];
//將使用兩個方法:calculateETAWithCompletionHandler:計算路線的花費的時間,
//calculateDirectionsWithCompletionHandler計算真實的路線。
//兩個方法都是異步的
[direction calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
if (error) {
NSLog(@"show director error %@",error);
}else
{ //方向指南響應
[self showDirectorOnMap:response];
}
}];
}
//渲染MKPoline
-(MKOverlayRenderer*)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
if ([overlay isKindOfClass:[MKPolyline class]]) {
MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
renderer.lineWidth = 3;
renderer.strokeColor = [UIColor redColor];
return renderer;
}else
{
return nil;
}
}
/**
*從蘋果服務器回送的對象是MKDirectionsResponse,還有源和目的地,包括MKRoute對象數組。注意,這個數組只有一個對象除非咱們設置setrequestsAlternateRoutes爲YES。
MKRoute 對象,如它的名字,表明用戶選擇的兩點之間的路線。它包含一些關於路線信息的屬性:
1、 name:從服務器找到路線時自動生成的。它是基於路線的重要特徵。
2、 advisoryNoties:字符串數組,包含一些適合生成路線的警告等諸如此類的詳情。
3、 distance:是沿着路線的距離,不是位移。單位是米。
4、 expectedTravelTime:NSTimeInterval,單位秒。
5、 transportType:
6、 polyline:MKPolyline表明地圖上路徑。能夠畫在MKMapView上,下一節將會看到。
7、 steps:MKRouteStep 對象的數組,製做路線的。
*
*/
//方向指南響應
-(void)showDirectorOnMap:(MKDirectionsResponse *)response
{
self.response = response;
for (MKRoute *route in self.response.routes) {
NSArray *routeoverlays = [NSArray arrayWithObject:route.polyline];
[self.mapview addOverlays:routeoverlays level:MKOverlayLevelAboveRoads ];
}
[self.mapview addAnnotation:self.response.source.placemark];
[self.mapview addAnnotation:self.response.destination.placemark];
}