MapKit和CoreLocation

女生的网名这么多〃 提交于 2020-03-01 12:41:54

简介 现在很多的社交软件都引入了地图和定位功能,要想实现这两大功能,需要导入两个框架:MapKit和CoreLocation

CoreLocation框架可以使用硬件设备来进行定位服务,不需要地图,精度相对略差,省电 MapKit框架能够使应用程序做一些地图展示与交互的相关功能,必须有地图,精度相对较高,费电

定位功能是所罗门(SoLoMo)应用的重要组成部分之一 几乎所有的iOS设备都支持位置服务,不过在使用位置服务之前,最好检查一下可用性

手机定位的三种方式:手机基站、WIFI、GPS

地图定位应该添加两个框架 #import <MapKit/MapKit.h> #import <CoreLocation/CoreLocation.h> 在此输入图片描述

地图的类型 可以通过设置MKMapView的mapViewType设置地图类型 MKMapTypeStandard 普通地图 MKMapTypeSatellite 卫星云图 MKMapTypeHybrid 普通地图覆盖于卫星云图之上

MapView的代理 MapView会将一些事件传递给它的代理(遵守MKMapViewDelegate协议),代理方法如下: mapViewWillStartLoadingMap: 当地图界面将要加载时调用 mapView:viewForAnnotation: 当地图上有大头针时调用 mapViewWillStartLocatingUser:当准备进行一个位置定位时调用 mapView:regionDidChangeAnimated: 当显示的区域发生变化时调用 mapView:didUpdateUserLocation:当用户位置发生变化时调用

设置地图显示区域 // 1) 用户所在位置的中心点坐标 CLLocationCoordinate2D center = userLocation.location.coordinate; // 2) 设置地图区域 MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(center, 100.0, 100.0);

[mapView setRegion:region animated:YES];

如何添加大头针(地标) 通过MapView的addAnnotation方法可以添加一个大头针到地图上 通过MapView的addAnnotations方法可以添加多个大头针到地图上

  • (void)addAnnotation:(id <MKAnnotation>)annotation; 说明需要传入一个遵守了MKAnnotation协议的对象

在此输入图片描述

新建一个遵守MKAnnotation协议的类 @interface MyAnnotation : NSObject <MKAnnotation> @property (nonatomic, assign) CLLocationCoordinate2D coordinate; @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) NSString *subtitle; @end

添加Annotation MyAnnotation *annotation = [[MyAnnotation alloc] init]; annotation.coordinate = CLLocationCoordinate2DMake(39.0, 106.0); annotation.title = @"我的地盘"; annotation.subtitle = @"我做主"; [_mapView addAnnotation:annotation];

自定义大头针 实现MapView的代理方法

  • (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { static NSString *ID = @"anno"; MKPinAnnotationView *annoView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID]; if (annoView == nil) { annoView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID]; // 显示气泡 annoView.canShowCallout = YES; // 设置绿色 annoView.pinColor = MKPinAnnotationColorGreen; }

    return annoView; } 在此输入图片描述

自定义大头针 可以通过设置MapAnnotationView的image属性来自定义大头针显示的图片

CoreLocation 请求用户批准定位 从iOS6开始,要想获得用户的位置,必须经过用户批准授权 当第一次使用定位服务时,会弹出一个框让用户选择 开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)

获得用户的位置 // 1. 实例化定位管理器 _locationManager = [[CLLocationManager alloc] init]; // 2. 设置代理 _locationManager.delegate = self; // 3. 定位精度 [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; // 4. 更新用户位置 [_locationManager startUpdatingLocation];

代理方法 当用户的位置发生改变时,就会不断调用代理方法,比如

  • (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

当定位失败时,会调用

  • (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

通过地址获得经纬度 地址  经纬度  大头针显示 _geocoder = [[CLGeocoder alloc] init]; [_geocoder geocodeAddressString:@"西三旗" completionHandler:^(NSArray *placemarks, NSError *error) { if (placemarks.count == 0) return;

// 取出位置
CLPlacemark *firstPlacemark = placemarks[0];
 
// 添加大头针
MyAnnotation *anno = [[MyAnnotation alloc] init];
anno.title = firstPlacemark.name; // 名称
anno.subtitle = firstPlacemark.country; // 国家
anno.coordinate = firstPlacemark.location.coordinate; // 坐标
[_mapView addAnnotation:anno];

}]; 在此输入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!