在使用系统自带的地图遇到的问题

在地图的定位中遇到 的问题(1.http://blog.csdn.net/m372897500/article/details/50770927

2.http://www.jianshu.com/p/217f041eeb24

3.大众点评是开放API 的,做团购可以去查阅Api

************************************************************************************************************

1.无法地图定位管理代理方法 

这两个新增的方法导致,之前写的程序在iOS8运行会出现,定位功能无法正常使用

这样让iOS8正常使用定位功能呢?

<1>你需要在info.plist表里面添加两条变量

 

在Info.plist中加入两个缺省没有的字段

  • NSLocationAlwaysUsageDescription      YES 
  • NSLocationWhenInUseUsageDescription  YES

这两个字段没什么特别的意思,就是自定义提示用户授权使用地理定位功能时的提示语。

手动请求:

_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:大头针

 *returnnil(设置位系统默认的大头针样式,默认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对象数组。注意,这个数组只有一个对象除非我们设置setrequestsAlternateRoutesYES

 MKRoute 对象,如它的名字,代表用户选择的两点之间的路线。它包含一些关于路线信息的属性:

 1        name:从服务器找到路线时自动生成的。它是基于路线的重要特征。

 2        advisoryNoties:字符串数组,包含一些适合生成路线的警告等诸如此类的详情。

 3        distance:是沿着路线的距离,不是位移。单位是米。

 4        expectedTravelTimeNSTimeInterval,单位秒。

 5        transportType

 6        polylineMKPolyline代表地图上路径。可以画在MKMapView上,下一节将会看到。

 7        stepsMKRouteStep 对象的数组,制作路线的。

 *

 */

//方向指南响应

-(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];

 

}

原文地址:https://www.cnblogs.com/meixian/p/5370941.html