iOS 开发指南 第16章 定位服务与地图应用之使用苹果地图

1 显示地图

MKMapView MKMapViewDelegate

准备:加载MapKit.framework

设置地图样式 代理-实现代理方法

- (void)viewDidLoad {
    [super viewDidLoad];
    设置样式,枚举类型MKMapType
    self.mapView.mapType = MKMapTypeStandard;
    // self.mapView.mapType = MKMapTypeSatellite;    将当前视图控制器赋值给地图视图的delegate属性
    self.mapView.delegate = self;
}

- (void)mapViewDidFailLoadingMap:(MKMapView *)theMapView withError:(NSError *)error {


NSLog(@"error : %@",[error description]);


}

2 添加标注

创建地图标注点类:实现MKAnnotation协议

触发添加动作:编码位置信息-移除地图标注点-调整地图位置和缩放比例 MKCoordinateRegion(CLLocationCoordinate2D center;MKCoordinateSpan span;) 并设置显示区域-设置标注点并放到地图上

实现地图委托方法mapView:viewForAnnotation:在地图视图添加标注时回调

触发添加动作- (IBAction)geocodeQuery:(id)sender {

    if (_txtQueryKey.text == nil || [_txtQueryKey.text length] == 0) {
        return;
    }

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:_txtQueryKey.text completionHandler:^(NSArray *placemarks, NSError *error) {

        NSLog(@"查询记录数:%lu",[placemarks count]);

        if ([placemarks count] > 0) {移除标注点
            [self.mapView removeAnnotations:self.mapView.annotations];
        }

        for (int i = 0; i < [placemarks count]; i++) {

            CLPlacemark* placemark = placemarks[i];

            //调整地图位置和缩放比例
            MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(placemark.location.coordinate, 10000, 10000);
            [self.mapView setRegion:viewRegion animated:YES];
            自定义的实现了MKAnnotation协议的地图标注点类(气泡信息)
            MyAnnotation *annotation = [[MyAnnotation alloc] init];            将编码好的位置信息放到地图标注点中
            annotation.streetAddress = placemark.thoroughfare;
            annotation.city = placemark.locality;
            annotation.state = placemark.administrativeArea;
            annotation.zip = placemark.postalCode;
            annotation.coordinate = placemark.location.coordinate;
            将标注点添加到地图视图上
            [self.mapView addAnnotation:annotation];
        }

        //关闭键盘
        [_txtQueryKey resignFirstResponder];
    }];

}

#pragma mark Map View Delegate Methods 实现协议


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

使用重用机制获取标注视图(annotation和annotationView的区别)

MKPinAnnotationView *annotationView

= (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:@"PIN_ANNOTATION"];

if(annotationView == nil) {

annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation

reuseIdentifier:@"PIN_ANNOTATION"];

}设置大头针标注图颜色

annotationView.pinColor = MKPinAnnotationColorPurple;

设置标注视图是否以动画效果的形式显示在地图上

annotationView.animatesDrop = YES;

设置附加信息气泡,气泡文字封装在MYAnnotation类中

annotationView.canShowCallout = YES;

return annotationView;


}

地图标注点类:

- (NSString *)title {协议方法就是设置title和subtitle
    return @"您的位置!";
}
- (NSString *)subtitle {拼接字符串

    NSMutableString *ret = [NSMutableString new];
    if (_state)
        [ret appendString:_state];
    if (_city)
        [ret appendString:_city];
    if (_city && _state)
        [ret appendString:@", "];
    if (_streetAddress && (_city || _state || _zip))
        [ret appendString:@" • "];
    if (_streetAddress)
        [ret appendString:_streetAddress];
    if (_zip)
        [ret appendFormat:@", %@", _zip];

    return ret;
}

3 跟踪用户位置变化

MapKit提供了跟踪用户位置和方向变化的API:开启showUserLocation属性并设置方法setUserTrackingMode:就可以了

- (void)viewDidLoad {
    [super viewDidLoad];

    if ([CLLocationManager locationServicesEnabled])判断能否开启定位服务
    {
        self.mapView.mapType = MKMapTypeStandard;
        self.mapView.delegate = self;
        //self.mapView.showsUserLocation = YES;允许跟踪用户信息        设置用户跟踪模式 枚举类型
        [self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
        //授权
        self.locationManager = [[CLLocationManager alloc] init];
        [self.locationManager requestWhenInUseAuthorization];
        [self.locationManager requestAlwaysAuthorization];
    }
}

4 使用程序外地图

只是用地图的基本功能而不需要设计自己的地图界面。

1)调用iOS苹果地图

MKPlacemark:定位使用的地标类,CLPlacemark是地图上的地标类

MKMapItem:封装了地图上一个点的信息类 ,我们将需要需要显示在地图上的点封装到这里,也用这个类调用苹果地图。

- (IBAction)geocodeQuery:(id)sender {

    if (self.txtQueryKey.text == nil || [self.txtQueryKey.text length] == 0) {
        return;
    }

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:self.txtQueryKey.text completionHandler:^(NSArray *placemarks, NSError *error) {
        NSLog(@"查询记录数:%lu",[placemarks count]);

        if ([placemarks count] > 0) {
            CLPlacemark* placemark = placemarks[0];
            获取地理坐标点
            CLLocationCoordinate2D coordinate = placemark.location.coordinate;            获取该地理坐标点的信息
            NSDictionary* address = placemark.addressDictionary;            定位地标点设置
            MKPlacemark *place = [[MKPlacemark alloc]
                                  initWithCoordinate:coordinate addressDictionary:address];
            设置地图上点的信息
            MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:place];            调用iOS自带的苹果地图应用 参数是字典类型可以控制显示地图的初始化信息
            [mapItem openInMapsWithLaunchOptions:nil];如果有多个点需要标注:先遍历再使用+(BOOL)openMapsWithItems:(NSArray *)mapItems launchOptions:(NSDictionary *)lunchOptions

//             //地图上设置行车路线 默认起点是当前位置,终点是查询的地点
//             NSDictionary* options =[[NSDictionary alloc]initWithObjectsAndKeys:
//             MKLaunchOptionsDirectionsModeDriving驾车路线,MKLaunchOptionsDirectionsModeKey设定路线模式, nil];
//
//             MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:place];
//             [mapItem openInMapsWithLaunchOptions:options];

            //关闭键盘
            [_txtQueryKey resignFirstResponder];
        }
    }];

}
时间: 2024-12-19 20:28:00

iOS 开发指南 第16章 定位服务与地图应用之使用苹果地图的相关文章

iOS 开发指南 第16章 定位服务与地图应用

1 定位服务编码 使用Core Location框架 CLLocationManger:用于定位服务管理类,能够给我们提供位置信息和高度信息,也可以监控设备进入或离开某个区域,还可以获得设备的运行方向等. CLLocation:封装了位置和高度信息. CLLocationMangerDelegate 准备:加载Core Location框架 修改工程配置:Supporting Files-Info.pist添加NSLocationAlwaysUSageDescription和NSLocation

iOS 开发指南 第15章 访问Web Service之REST Web Service

***** 在电脑术语中,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串. 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作.URI由包括确定语法和相关协议的方案所定义. Web上可用的每种资源 -HTML文档.图像.视频片段.程序等 - 由一个通用资源标识符(Uniform Resource Identifier, 简称"URI")进行定位. ***** 1 REST Web Ser

iOS开发指南 第8章 iOS常用设计模式 学习

设计模式是在特定场景下对特定问题的解决方案 1 单例模式 作用:解决“应用中只有一个实例”的问题,这个实例的作用是全局的,比如说是可以实现一些共享资源 方法的访问和状态的保持 实现原理:一般会封装一个静态属性,并提供静态实例的创建方法. *********** James Rumbaugh对类的定义是:类是具有相似结构.行为和关系的一组对象的描述符.类是面向对象系统中最重要的构造块.类图显示了一组类.接口.协作以及他们之间的关系. 建立类图的步骤: (1)研究分析问题领域确定系统需求. (2)确

iOS开发指南 第7章 视图控制器与导航模式 学习

1 概述 分类:平铺导航模式 标签导航模式 树形导航模式 2 模态视图 必须要一个单独的模态视图控制器 呈现 代码方法:presentViewController:animated:completion: 故事板segue方式 关闭 dismissViewControllerAnimated:completion: 获取navigationBar:拖拽一个 Editor-Embed in-Navigation Controller 创建一个navigation controller interf

IOS开发指南第四章 IOS8多分辨率屏幕适配 学习

1 获取IOS设备屏幕信息 CGSize iOSDeviceScreenSize = [UIScreen mainScreen].bounds.size; NSString *s = [NSString stringWithFormat:@"%.0f x %.0f", iOSDeviceScreenSize.width, iOSDeviceScreenSize.height]; 获取设备信息判断是否是ipone-判断横屏还是竖屏-判断设备型号 属性userInterfaceIdiom是

iOS 开发指南 第12章 应用程序设置

1 概述 设置中的项目在应用中是不经常变化的,它决定了应用的基本特征和行为. 配置是在应用内部开辟出来的功能块,是应用的一部分,项目是经常变化的. 2 应用程序设置包 Settings Bundle是一个包文件,其中含有设置界面中所需的项目的描述 用到的照片 文字的本地化 子设置项目的描述等内容.通过finder打开. Root.plist文件描述根设置界面中设置的项目信息. en.lproj文件夹和Root.strings文件是和本地化有关,用于设置界面信息的本地化. 创建:iOS-Resou

iOS 开发指南 第11章 数据持久化之对象归档 学习

1 是一种序列化方式,先将归档对象序列化为一个文件,然后再通过反归档将数据恢复到对象中. 条件:该对象的类必须实现NSCoding协议,而且每个成员变量应该是基本数据类型或都是实现NSCoding协议的某个类的实例. 归档类NSKeyedArchiver 反归档类NSKeyedUnarchiver  NSData类提供了读取数据文件的方法 方法:+dataWithContentsOfFile: +dataWithContentsOfFile:options:指定读取数据选项error: -ini

iOS 开发指南 第11章 数据持久化之SQLite 学习

1 SQLite是无数据类型的数据库,就是字段不用指定类型.但从编程规范上说,应该在Create Table语句中指定数据类型:INTERGER 有符号的整数类型 REAL 浮点类型 TEXT 字符串类型 BLOB二进制类型 2 创建数据库: 准备:添加SQLite3库到工程中 TARGETS-Link Binary With Libraries-添加libsqlite3.dylib 使用sqlite3_open打开数据库-使用sqlite3_exec执行Creat Table语句,创建数据库-

IOS 开发指南 第5章 委托协议 数据源协议 高级视图学习

1 委托对象负责控制控件的外观和对控件的事件和状态作出反应 数据源对象是控件与应用数据(model)的桥梁,一般是必须实现的. 2 选择器 UIPickerView 为用户提供选择 1)日期选择器 UIDatePicker 设置属性检查器中的各个属性-代码 -setDateFormat:设置日期格式 -stringFromDate:获取时间 - (IBAction)onclick:(id)sender { NSDate * theDate = self.datePicker.date;获取选中日