iOS8 地图的使用
在iOS8 中, 若使用系统自带的地图, 首先在Plist文件中添加两个字段 : NSLocationAlwaysUsageDescription 和 NSLocationWhenInUseUsageDescription 类型均为String类型 其次要注意 : Supported interface orientations 是否存在 不存在则创建 (Array类型);
使用地图首先引入MapKit库 之后必要的一个代理<CLLocationManagerDelegate>
@interface ViewController ()<CLLocationManagerDelegate> @property (nonatomic, strong) MKMapView *mapView; @property (nonatomic, strong) CLLocationManager *locationManager; @property (nonatomic, strong) CLLocation *nameLocation; @end
创建地图:
self.mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 140, self.view.frame.size.width, self.view.frame.size.height - 140)];
self.mapView.showsUserLocation = YES; // 定位到自己的位置
//self.mapView.mapType = MKMapTypeSatellite; // 地图类型 这里是卫星 具体地图类型请查看API
[self.view addSubview:self.mapView];
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
_locationManager.desiredAccuracy = kCLLocationAccuracyBest; //控制定位精度,越高耗电量越大。
_locationManager.distanceFilter = 10; //控制定位服务更新频率。单位是“米”
[self.locationManager startUpdatingLocation];
在iOS8中 可能会不弹出是否允许使用地理位置的AlertView, 需要处理一下
if([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[_locationManager requestWhenInUseAuthorization];
}
// 判断服务是否开启
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
if (
([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)] && status != kCLAuthorizationStatusNotDetermined && status != kCLAuthorizationStatusAuthorizedWhenInUse) ||
(![_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)] && status != kCLAuthorizationStatusNotDetermined && status != kCLAuthorizationStatusAuthorized)
) {
NSString *message = @"您的手机目前未开启定位服务,如欲开启定位服务,请至设定开启定位服务功能";
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"无法定位" message:message delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil];
[alertView show];
}else {
[_locationManager startUpdatingLocation];
}
}
创建一个大头针类 : CustomAnnotation 继承于NSObject
//
// CustomAnnotation.h
// Map
//
// Created by 高岐 on 15/4/6.
// Copyright (c) 2015年 GaoQi. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface CustomAnnotation : NSObject<MKAnnotation>
{
CLLocationCoordinate2D coordinate;
NSString *title;
NSString *subtitle;
}
-(id) initWithCoordinate:(CLLocationCoordinate2D) coords;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
@end
//
// CustomAnnotation.m
// Map
//
// Created by 高岐 on 15/4/6.
// Copyright (c) 2015年 GaoQi. All rights reserved.
//
#import "CustomAnnotation.h"
@implementation CustomAnnotation
@synthesize coordinate, title, subtitle;
-(id) initWithCoordinate:(CLLocationCoordinate2D) coords
{
if (self = [super init]) {
coordinate = coords;
}
return self;
}
@end
// 添加大头针
-(void)createAnnotationWithCoords:(CLLocationCoordinate2D) coords {
CustomAnnotation *annotation = [[CustomAnnotation alloc] initWithCoordinate:
coords];
// 通过self.nameLocation 点击大头针得到具体街道地址
CLGeocoder *clGeoCoder = [[CLGeocoder alloc] init];
[clGeoCoder reverseGeocodeLocation:self.nameLocation completionHandler: ^(NSArray *placemarks,NSError *error) {
for (CLPlacemark *placeMark in placemarks)
{
NSDictionary *addressDic=placeMark.addressDictionary;
NSString *state=[addressDic objectForKey:@"State"];
NSString *city=[addressDic objectForKey:@"City"];
NSString *subLocality=[addressDic objectForKey:@"SubLocality"];
NSString *street=[addressDic objectForKey:@"Street"];
annotation.title = [NSString stringWithFormat:@"%@%@%@%@", state, city, subLocality, street]; // 点击大头针得到具体街道地址
}
}];
[self.mapView addAnnotation:annotation];
}
接下来就是定位了
// 通过城市名字用大头针定位, 这是通过一个button 和一个 textField(self.text) 来进行搜索的 以下是button 的点击方法 实际上是先定位 在放置大头针的(只能定位在国内)
- (void)buttonClick
{
// 通过大头针定位在故宫
// CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(39.915352,116.397105);
// float zoomLevel = 0.02;
// MKCoordinateRegion region = MKCoordinateRegionMake(coords, MKCoordinateSpanMake(zoomLevel, zoomLevel));
// [self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES];
//
//
// [self createAnnotationWithCoords:coords];
// 通过名字获取地理位置 并用大头针定位
CLGeocoder *myGeocoder = [[CLGeocoder alloc] init];
[myGeocoder geocodeAddressString:self.text.text completionHandler:^(NSArray *placemarks, NSError *error) {
if ([placemarks count] > 0 && error == nil)
{
// NSLog(@"Found %lu placemark(s).", (unsigned long)[placemarks count]);
CLPlacemark *firstPlacemark = [placemarks objectAtIndex:0];
//NSLog(@"Longitude = %f", firstPlacemark.location.coordinate.longitude);
//NSLog(@"Latitude = %f", firstPlacemark.location.coordinate.latitude);
// 通过经纬度得到地理信息(省,市,区,街道) 传回到大头针哪里 然后大头针定位
self.nameLocation = [[CLLocation alloc] initWithLatitude:firstPlacemark.location.coordinate.latitude longitude:firstPlacemark.location.coordinate.longitude];
// P.S.这个地方我也不知道写的对不对 (是点击搜索button会缓冲一段时间的问题 不是定位问题 网络慢?)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(firstPlacemark.location.coordinate.latitude,firstPlacemark.location.coordinate.longitude);
float zoomLevel = 0.02;
MKCoordinateRegion region = MKCoordinateRegionMake(coords, MKCoordinateSpanMake(zoomLevel, zoomLevel));
[self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES]; // 移动到定位的位置
dispatch_async(dispatch_get_main_queue(), ^{
[self createAnnotationWithCoords:coords];
});
});
}
else if ([placemarks count] == 0 && error == nil)
{
NSLog(@"Found no placemarks.");
}
else if (error != nil)
{
NSLog(@"An error occurred = %@", error);
}
}];
}
还有一些代理方法之类的
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
// 代理方法打印经纬度
[self.locationManager stopUpdatingLocation];
NSString *strLat = [NSString stringWithFormat:@"%.4f",newLocation.coordinate.latitude];
NSString *strLng = [NSString stringWithFormat:@"%.4f",newLocation.coordinate.longitude];
NSLog(@"Lat: %@ Lng: %@", strLat, strLng);
// 地图移动到当前位置
CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(newLocation.coordinate.latitude,newLocation.coordinate.longitude);
float zoomLevel = 0.02;
MKCoordinateRegion region = MKCoordinateRegionMake(coords,MKCoordinateSpanMake(zoomLevel, zoomLevel));
[self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES];
}
// 错误报告
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
NSLog(@"locError:%@", error);
}

浙公网安备 33010602011771号