iOS学习之路08

来源:互联网 发布:超市数据分析报告格式 编辑:程序博客网 时间:2024/06/04 19:23
  • MapKit
    • MKMapView类
      • MKMapView是显示地图的视图,只需要将MKMapView对象添加到self.view中即可实现地图显示
      • 常用属性
        • mapType:地图视图类型
          • MKMapTypeStandard:交通地图
          • MKMapTypeSateLLite:卫星地图
          • MKMapTypeHybrid:交通和卫星地图
          • MKMapTypeSateLLiteHyover:3D立体地图
          • MKMapTypeHybridFlyover:3D混合地图
        • showsUserLocation:设置是否显示用户定位
        • delegate:MKMapViewDelegate委托
    • 添加标注
      • 创建MKPointAnnotation标注对象,并设置属性

        MKPointAnnotation *pointAnnotation = [[MKPointAnnotation alloc] init];

        // 设置点标注的经纬度

        pointAnnotation.coordinate = coordinate;

        // 设置辅助视图的中间视图的正标题。如果未设置标题,会导致辅助视图无法显示

        pointAnnotation.title = @"查询地名中...";

        // 设置辅助视图的中间视图的副标题

        pointAnnotation.subtitle = [NSString stringWithFormat:@"%f, %f",coordinate.latitude,coordinate.longitude];

        [self.mapView addAnnotation:pointAnnotation];

      • 实现mapView: viewForAnnotation: 委托方法,将标注转化为MKAnnotationView标注视图。将标注试图添加到地图视图上时会调用此委托

        - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

        {

        // 判断annotation(标注)是否为用户当前位置的标注

        if (![annotation isKindOfClass:[MKPointAnnotation class]]) {

        return nil;

        }

         

        NSString *identifier = @"annotationViewIdentifier";

        //添加 MKPinAnnotationView标注视图

         

        MKPinAnnotationView *pinAnnotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

         

        if (!pinAnnotationView) {

        pinAnnotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];

        // 这里就可以自定标注视图了

        pinAnnotationView.pinTintColor = [UIColor orangeColor]; // pinTintColor属性属于 自己MKPinAnnotationView

        // 标注视图是否要显示注释内容

        pinAnnotationView.canShowCallout = YES; // canShowCallout属性属于 父类MKAnnotationView

        // 在标注时是否以动画的形式出现

        pinAnnotationView.animatesDrop = YES; // animatesDrop属性属于 自己MKPinAnnotationView

        }

        return pinAnnotationView;

        }

      • MKAnnotationView(标注试图类)
        • 常用属性
          • canShowCallout:是否显示辅助视图(注释内容)
          • image:设置标注视图显示的图片
          • leftCalloutAccessoryView:设置辅助视图的左侧视图
          • rightCalloutAccessoryView:设置辅助视图的右侧视图
          • centerOffeset:设置标注视图图片的偏移量。x取负值—向左移动,y取负值:向上移动
          • calloutOffset:设置辅助视图的偏移量
      • MKPinAnnotationView(父类:MKAnnotationView)
        • 常用属性
          • pinTintColor:设置标注视图颜色
          • animatesDrop:设置是否以动画的形式出现
    • 定位
      • CLLocationManager:定位管理类
      • 常用属性
        • distanceFilter:更新频率,用户位置差多少m后更新定位
        • desiredAccuracy:定位精度,允许误差范围

          KCLLocationAccuracyBastForNavigation:最精准,适用于导航

          KCLLocationAccuracyBast:最精准

          KCLLocationAccuracyNearestTenMeters:十米误差

          KCLLocationAccuracyHundredMeters:百米误差

          KCLLocationAccuracyKilometer:千米误差

          KCLLocationAccuracyThreeKilometers:三千米误差

      • 实现定位的步骤
        • 设置mapView.showsUserLocation = YES;显示用户定位的属性
        • 在info.plist文件中添加属性NSLocationWhenInUseUsageDescription(只有应用程序处于前台时才能定位)或加属性NSLocationAlwaysUsageDescription(应用程序处于前台/后台都可定位)
        • 请求用户App是否可以获取用户定位

          // respondsToSelector:判断是否存在某方法

          if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {

           

          /* requestWhenInUseAuthorization方法:请求当前用户,是否可以定位用户的位置

          在调用这个方法前需要在info.plist文件中添加属性NSLocationWhenInUseUsageDescription(只有应用程序处于前台时才能定位)

          或者属性NSLocationAlwaysUsageDescription(应用程序处于前台/后台都可以定位)

          */

          [self.locationManager requestWhenInUseAuthorization];

          }

        • 实现委托方法mapView: didUpdateUserLocation: 在方法中放置mapView的region(地图范围)属性。CLLocation对象:代表随着精度、时间戳信息的地理坐标

          - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

          {

          NSLog(@"用户位置已经更新");

          // 设置中心点,中心点即使用户当前所在的位置 // CLLocation对象:代表随着精度和时间戳信息的地理坐标

          CLLocationCoordinate2D center = userLocation.location.coordinate;// coordinate:当前位置的坐标

          // 设置地图跨度

          MKCoordinateSpan span = {0.01, 0.01};

          MKCoordinateRegion region = {center, span};

          // 设置地图的范围,包含中心点、地图跨度

          [mapView setRegion:region animated:YES];

          }

        • 实现委托方法mapView: viewForAnnotation: 如果未实现,标注将无法显示
    • CLGeocoder
      • 通过地址信息获取经纬度坐标

        CLGeocoder *geocoder = [[CLGeocoder alloc] init];

        [geocoder geocodeAddressString:name completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {

        CLLocation *location = [placemarks lastObject].location;

        NSLog(@"根据地名查询经纬度:%f, %f",location.coordinate.latitude,location.coordinate.longitude);

        }];

      • 通过经纬度坐标获取地址信息

        // 创建地理编码对象

        CLGeocoder *geocoder = [[CLGeocoder alloc] init];

        CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];

        // 获取地址信息通过经纬度

        [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {

        NSString *addressName = [placemarks lastObject].name;

        NSLog(@"%@",addressName);

        // 查询出来地址信息后利用block对当前的那个辅助视图进行更新

        if (self.geocoderCompletionHandler) {

        self.geocoderCompletionHandler(addressName);

        }

        }];

      • 注:在需要进行更新的地方(例:在添加标注的地方)将属性geocoderCompletionHandler实现
  • 百度地图SDK
原创粉丝点击