MapKit和CoreLocation

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

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

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

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

地图定位应该添加两个框架

import

import

MapKit和CoreLocation_第1张图片

地图的类型
可以通过设置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 )annotation;
    说明需要传入一个遵守了MKAnnotation协议的对象

MapKit和CoreLocation_第2张图片

新建一个遵守MKAnnotation协议的类
@interface MyAnnotation : NSObject
@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 )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;
    }
    MapKit和CoreLocation_第3张图片

自定义大头针
可以通过设置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];

}];
MapKit和CoreLocation_第4张图片

你可能感兴趣的:(MapKit,CoreLocation)