读书频道 > 移动开发 > ios开发 > iOS 5编程入门经典(第3版)——开发iPhone与iPad应用
20.2.2 使用地图显示位置
2012-11-08 11:36:06     我来说两句 
收藏    我要投稿   
本书面向iPhone和iPad开发初学者,涵盖了iOS开发的各个主题。本书的编写方式是渐进式的,这样读者就不会由于细节过多而疲于奔命。我认为最好的学习方式就是去实践,因此全书大量的试一试首先会介绍如何构建某个应...  立即去当当网订购

虽然获取位置的对应值很有趣,但如果不能将其以可视化的形式显示在地图上,那么也没什么用。因此,最理想的情况是使用位置信息并将其显示在地图上。在下面的“试一试”中,将使用本章前面介绍的Map Kit框架来显示Core Location框架返回的位置坐标的地图。另外,你还将学到如何以编程方式而不是在Interface Builder中创建地图。

 试一试       使用地图显示位置

(1) 使用刚才创建的LBS项目,将MapKit.framework添加到Frameworks文件夹中,如图20-9所示。


 

(2) 将如下粗体语句插入到LBSViewController.h文件中:
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>

@interface LBSViewController : UIViewController
<CLLocationManagerDelegate,MKMapViewDelegate> {
    IBOutlet UITextField *accuracyTextField;
    IBOutlet UITextField *latitudeTextField;
    IBOutlet UITextField *longitudeTextField;
    CLLocationManager *lm;
    MKMapView *mapView;
}

@property (retain, nonatomic) UITextField *accuracyTextField;
@property (retain, nonatomic) UITextField *latitudeTextField;
@property (retain, nonatomic) UITextField *longitudeTextField;

@end

(3) 在LBSViewController.m文件中添加如下粗体语句:
#import "LBSViewController.h"

@implementation LBSViewController

@synthesize latitudeTextField;
@synthesize longitudeTextField;
@synthesize accuracyTextField;

- (void)viewDidLoad
{
    lm = [[CLLocationManager alloc] init];
    lm.delegate = self;
    lm.desiredAccuracy = kCLLocationAccuracyBest;
    lm.distanceFilter = kCLDistanceFilterNone;
    [lm startUpdatingLocation];
   
    //---display the map in a region---   
    mapView = [[MKMapView alloc]              
                  initWithFrame:CGRectMake(0, 130, 320, 340)];   
    mapView.delegate = self;
    mapView.mapType = MKMapTypeHybrid;   
    [self.view addSubview:mapView];

    [super viewDidLoad];
}

- (void) locationManager :(CLLocationManager *) manager
      didUpdateToLocation  :(CLLocation *) newLocation
              fromLocation  :(CLLocation *) oldLocation {
   
    //---display latitude---
    NSString *lat = [[NSString alloc] initWithFormat:@"%f",
                        newLocation.coordinate.latitude];
    latitudeTextField.text = lat;
   
    //---display longitude---
    NSString *lng = [[NSString alloc] initWithFormat:@"%f",
                        newLocation.coordinate.longitude];
    longitudeTextField.text = lng;
   
    //---display accuracy---
    NSString *acc = [[NSString alloc] initWithFormat:@"%f",
                        newLocation.horizontalAccuracy];
    accuracyTextField.text = acc;
   
    [acc release];
    [lat release];
    [lng release];
   
    //---update the map---   
    MKCoordinateSpan span;   
    span.latitudeDelta = .001;   
    span.longitudeDelta = .001;   
   
    MKCoordinateRegion region;
    region.center = newLocation.coordinate;
    region.span = span;
    [mapView setRegion:region animated:TRUE];   
}

- (void)dealloc {
    [mapView release];
    [lm stopUpdatingLocation];
    [lm release];
    [latitudeTextField release];
    [longitudeTextField release];
    [accuracyTextField release];
    [super dealloc];

(4) 按Command+R组合键,在iPhone Simulator中测试应用程序。观察地图,上面会显示位置管理器报告的位置,如图20-10所示。地图的中心就是报告的位置。


 

注意:如果在实际的iPhone设备上测试该应用程序,那么会在移动设备时看到地图动态更新自身。在iPhone Simulator中,通过选择Debug | Location,然后选择目标位置模拟来模拟移动,如图20-11所示。


 

示例说明

为了在应用程序中使用Map Kit框架,首先需要将MapKit.framework添加到项目中。
然后,在视图控制器中实现MKMapViewDelegate协议以处理与Map View关联的各种方法:

@interface LBSViewController : UIViewController

<CLLocationManagerDelegate, MKMapViewDelegate> {

当View窗口加载后,动态创建MKMapView类的一个实例并设置将要显示的地图类型(混合型—包含地图与卫星):
    //---display the map in a region---   
    mapView = [[MKMapView alloc]              
                  initWithFrame:CGRectMake(0, 130, 320, 340)];   
    mapView.delegate = self;
    mapView.mapType = MKMapTypeHybrid;   
    [self.view addSubview:mapView];

这里指定了要显示的地图的大小。将delegate属性设置为self,从而使视图控制器能够实现在MKMapViewDelegate协议中声明的方法。

当更新位置信息时,使用mapView对象的“setRegion:”方法放大该位置:
    //---update the map---   
    MKCoordinateSpan span;   
    span.latitudeDelta = .001;   
    span.longitudeDelta = .001;   
   
    MKCoordinateRegion region;
    region.center = newLocation.coordinate;
    region.span = span;
    [mapView setRegion:region animated:TRUE];

注意:请参考Apple公司的文档以了解关于MKMapView类的更多信息,文档的地址是http://developer.apple.com/library/ios/#documentation/MapKit/ Reference/MKMapView_Class/MKMapView/MKMapView.html

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:20.2.1 指定位置跟踪的硬件需求
下一篇:20.2.3 获取方向信息
相关文章
图文推荐
1.3.5 有限的屏幕尺
1.2 必备条件
精通iOS开发 : 第7版
3.5 iFunBox
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站