简易地图(MKMapView,CLLocationManagerDelegate,CLGeocoder)

概要

本章主要简示了IOS里面位置服务的使用,包括定位,地图,地图标记以及地图定位。由于现在的地图开发和以前的差别比较大,而且地图涉及的东西相对而言复杂点,所以本实验耗时比较多,有的地方还存在一些问题。

结果展示

注意文本框的两个数字是当前的经纬度,地图视图切换是切换到该经纬度的位置,最后红色的那个标注即为地图中的经纬度,不过由于经纬度解析部分有问题,所以未能显示经纬度的对应地址是什么。(示例里面不是使用代理来解析经纬度的,使用的是CLGeocoder,因为以前使用的代理官方建议不再使用了。)

流程概要

1.在开始工程之前需要知道主要步骤:a.定位当前的地址 b.解析经纬度获取对应的地址,然后地图视图切换到该位置 c.在地图上标注该位置

2.定位部分因为看到的教程较老,所以实际操作有差别,最新的定位需要增加授权。其主要方法是在修改info.list文件,然后再代码里面添加授权代码。如下所示:

/*
1.Info.plist中加入两个缺省没有的字段
  NSLocationAlwaysUsageDescription
  NSLocationWhenInUseUsageDescription
  并设置值为YES
*/

//2.在启动定位前设置授权
// 开始定位
-(void)onLocate
{
    self._textLocationInfo.text = @"";
    self._locateManage = [[CLLocationManager alloc] init];
    self._locateManage.delegate = self;
    self._locateManage.desiredAccuracy = kCLLocationAccuracyBest;
    self._locateManage.distanceFilter = 1000;

    // 新版本需要授权
    if ([[[UIDevice currentDevice] systemVersion] doubleValue] > 8.0)
    {
        [self._locateManage requestWhenInUseAuthorization];
    }

    [self._locateManage startUpdatingLocation];
    [self._locateActivityIndicator startAnimating];
}

3.实现定位代理的协议和地图代理协议,主要是完成以下方法:

#pragma 实现协议CLLocationManagerDelegate
// 定位成功调用该方法,数组里面最后的成员为最新的地址
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations

// 授权完成调用该方法,可查看授权状态
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;
// 定位失败调用该方法
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error;

#pragma 实现协议MKMapViewDelegate
// 画标注
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;

4.在获取地址成功后,根据地址中的经纬度设置地图视图,然后使用CLGeocoder解析经纬度地址。

5.解析出地址后需要在地图上标注出当前位置,此时需要新建一个类,实现标注的协议,指定标注的经纬度、标题以及子标题

6.完成后,停止定位

主要代码

h文件

//
//  ViewController.h
//  FindMe
//
//  Created by God Lin on 14/12/13.
//  Copyright (c) 2014年 arbboter. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController : UIViewController <CLLocationManagerDelegate, MKMapViewDelegate>
{
    MKMapView* _mapView;
    UIButton* _buttonLocate;
    UITextView* _textLocationInfo;
    UIActivityIndicatorView* _locateActivityIndicator;

    CLLocationManager* _locateManage;
}

@property (nonatomic, retain) MKMapView* _mapView;
@property (nonatomic, retain) UIButton* _buttonLocate;
@property (nonatomic, retain) UITextView* _textLocationInfo;
@property (nonatomic, retain) UIActivityIndicatorView* _locateActivityIndicator;
@property (nonatomic, retain) CLLocationManager* _locateManage;
@end

m文件

//
//  ViewController.m
//  FindMe
//
//  Created by God Lin on 14/12/13.
//  Copyright (c) 2014年 arbboter. All rights reserved.
//

#import "ViewController.h"
#import "MapLocation.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize _buttonLocate, _locateActivityIndicator, _mapView, _textLocationInfo;
@synthesize _locateManage;

// 界面控件布局
-(void)autoLayout
{
    CGFloat _x = self.view.frame.origin.x;
    CGFloat _y = self.view.frame.origin.y;
    CGFloat _w = self.view.frame.size.width;
    CGFloat _h = self.view.frame.size.height;

    CGFloat xEdge = 10;
    CGFloat yEdge = 10;
    CGFloat x = _x + xEdge;
    CGFloat y = _y + 2*yEdge;
    CGFloat w = _w - 2*xEdge;
    CGFloat h = 50;

    self._mapView.frame = CGRectMake(x, y, w, _h - y - yEdge - h);

    y = self._mapView.frame.origin.y + self._mapView.frame.size.height + yEdge;
    h -= 5;
    self._buttonLocate.frame = CGRectMake(x, y, w/5, h);
    self._buttonLocate.layer.cornerRadius = 10;
    self._buttonLocate.layer.borderWidth = 1;
    [self._buttonLocate setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [self._buttonLocate setTitle:@"Locate" forState:UIControlStateNormal];

    CGFloat xSameLevelEdge = 2;
    x = x + self._buttonLocate.frame.size.width;
    self._textLocationInfo.frame = CGRectMake(x+xSameLevelEdge, y, 4*w/5-xSameLevelEdge, h);
    self._textLocationInfo.layer.borderWidth = 1;
    self._textLocationInfo.layer.cornerRadius = 10;
    self._textLocationInfo.editable = NO;

    self._locateActivityIndicator.frame = CGRectMake(0,0, h*2, h*2);
    [self._locateActivityIndicator setCenter:CGPointMake(_w/2, _h/2)];
    [self._locateActivityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge];
    self._locateActivityIndicator.color = [UIColor blackColor];
}

// 开始定位
-(void)onLocate
{
    self._textLocationInfo.text = @"";
    self._locateManage = [[CLLocationManager alloc] init];
    self._locateManage.delegate = self;
    self._locateManage.desiredAccuracy = kCLLocationAccuracyBest;
    self._locateManage.distanceFilter = 1000;

    // 新版本需要授权
    if ([[[UIDevice currentDevice] systemVersion] doubleValue] > 8.0)
    {
        [self._locateManage requestWhenInUseAuthorization];
    }

    [self._locateManage startUpdatingLocation];
    [self._locateActivityIndicator startAnimating];
}

-(void)stopLocate
{
    if(self._locateManage)
    {
        [self._locateManage stopUpdatingLocation];
        self._locateManage.delegate = nil;
        [self._locateManage release];
        self._locateManage = nil;
        [self._locateActivityIndicator stopAnimating];
    }
}
- (void)viewDidLoad
{
    [super viewDidLoad];

    self._mapView = [[MKMapView alloc] init];
    [self.view addSubview:self._mapView];

    self._buttonLocate = [[UIButton alloc] init];
    [self._buttonLocate addTarget:self action:@selector(onLocate) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self._buttonLocate];

    self._textLocationInfo = [[UITextView alloc] init];
    [self.view addSubview:self._textLocationInfo];

    self._locateActivityIndicator = [[UIActivityIndicatorView alloc] init];
    [self.view addSubview:self._locateActivityIndicator];

    [self autoLayout];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)dealloc
{
    [_locateActivityIndicator release];
    [_mapView release];
    [_textLocationInfo release];
    [_buttonLocate release];
    [super dealloc];
}

#pragma 实现协议CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations
{
    NSLog(@"%@", locations);
    CLLocation* curLocation = [locations lastObject];

    // 地图定位到当前位置
    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(curLocation.coordinate, 1000, 1000);
    viewRegion = [self._mapView regionThatFits:viewRegion];
    [self._mapView setRegion:viewRegion animated:YES];

    // 解析经纬度为地址,在地图上添加标注
    MapLocation* annotation = [[MapLocation alloc] init];
    annotation.coordinate = curLocation.coordinate;
    CLGeocoder* geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:curLocation completionHandler:^(NSArray *placemarks, NSError *error)
    {
        if(error)
        {
            NSLog(@"CLGeocoder error -> %@", [error localizedDescription]);
        }
        else
        {
            CLPlacemark *placemark = [placemarks lastObject];
            NSString* startAddressString = [NSString stringWithFormat:@"%@ %@ %@ %@ %@ %@",
                                            placemark.subThoroughfare, placemark.thoroughfare,
                                            placemark.postalCode, placemark.locality,
                                            placemark.administrativeArea,
                                            placemark.country];
            NSLog(@"地址为:%@", startAddressString);

            annotation._city = placemark.locality;
            annotation._country = placemark.country;
            annotation._streetAddrerss = placemark.thoroughfare;
            annotation._zip = placemark.postalCode;
            annotation._state = placemark.name;
        }
    }];
    [self._mapView addAnnotation:annotation];
    [geoCoder release];

    // 设置文本信息
    NSString* stringLocation = [[NSString alloc] initWithFormat:@"%@\n%@", annotation.subtitle, annotation.title];
    self._textLocationInfo.text = stringLocation;
    [stringLocation release];

    [annotation release];
    [self stopLocate];
}

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    NSLog(@"Authorization finished. status = %d", status);
}

- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error
{
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Locate Failed" message:[error description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    NSLog(@"%@", [error description]);
    [alert show];
    [alert release];
    [self._locateActivityIndicator stopAnimating];

    [self stopLocate];
}

#pragma 实现协议MKMapViewDelegate
// 画标注
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;
{
    MKPinAnnotationView* annotationView = (MKPinAnnotationView*)[self._mapView dequeueReusableAnnotationViewWithIdentifier:@"annotationView"];
    if(annotationView == nil)
    {
        annotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotationView"] autorelease];
    }
    annotationView.canShowCallout = YES;
    annotationView.pinColor = MKPinAnnotationColorRed;
    annotationView.animatesDrop = YES;
    return annotationView;
}

@end

(实现标注协议的类见工程代码)

项目工程

时间: 2024-10-05 05:08:07

简易地图(MKMapView,CLLocationManagerDelegate,CLGeocoder)的相关文章

iOS 地图(MKMapView)

//定位  需要在info中添加NSLocationWhenInUseUsageDescription if ([[UIDevice currentDevice].systemVersion doubleValue]>=8.0) { //获取权限 [self.locationManager requestWhenInUseAuthorization]; } //开始定位 [self.locationManager startUpdatingLocation]; //懒加载 -(CLLocatio

iOS进阶学习-地图

一.地图的简介 在移动互联网时代,移动app能解决用户的很多生活琐事,比如: 导航:去任意陌生的地方. 周边:找餐馆.找酒店.找银行.找电影院. 手机软件:微信摇一摇.QQ附近的人.微博.支付宝等. 在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这两大功能,必须基于两个框架进行开发: Map Kit :用于地图展示. Core Location :用于地理定位. 二.地图定位(CoreLocation框架,地理编码与反地理编码) 1.CoreLocation框架的使用 导入头文件

iOS开发 定位服务与地图

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要实现地图.导航功能,往往需要先熟悉定位功能,在iO

iOS8定位与地图

iOS开发系列--地图与定位 转载:http://www.cnblogs.com/kenshincui/ 概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看

ios之定位与地图

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用 和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒 店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开 发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要 实现地图.导航功能,往往需要先熟悉定位功能

iOS开发--地图与定位

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用 和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒 店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开 发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要 实现地图.导航功能,往往需要先熟悉定位功能

iOS开发系列--地图与定位

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要实现地图.导航功能,往往需要先熟悉定位功能,在iO

转-iOS开发系列--地图与定位

来自: http://www.cnblogs.com/kenshincui/p/4125570.html#autoid-3-4-0 概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用

iOS开发系列--地图与定位-ios8

概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个陌生的地方想要查找附近的酒店.超市等就可以打开软件搜索周边;类似的,还有很多团购软件可以根据你所在的位置自动为你推荐某些商品.总之,目前地图和定位功能已经大量引入到应用开发中.今天就和大家一起看一下iOS如何进行地图和定位开发. 定位 地图 定位 要实现地图.导航功能,往往需要先熟悉定位功能,在iO