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

大多数iOS设备都内置了一个指南针。下面的“试一试”展示了如何使用这个新功能以编程方式获得方向信息。

 试一试       使用指南针

需要使用真实设备(iPhone)测试此应用程序。

(1) 使用LBS项目,在项目的Supporting Files文件夹中添加一幅名为Compass.gif的图像,如图20-12所示。


 

(2) 在Interface Builder中,拖放一个Image View视图到View窗口中,并在Attributes Inspector窗口中将其Image属性设置为Compass.gif,将其View Mode属性设置为Aspect Fit。另外,在View窗口中添加一个Label,如图20-13所示。


 

(3) 在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;
   
    IBOutlet UIImageView *compass;
    IBOutlet UILabel *heading;
}

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

@property (nonatomic, retain) UIImageView *compass;
@property (nonatomic, retain) UILabel *heading;

@end

(4) 在Interface Builder中进行如下操作:

● 按住Control键并将File’s Owner项拖放到Image View上。选择compass。

● 按住Control键并将File’s Owner项拖放到Label View上。选择heading。

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

@implementation LBSViewController

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

@synthesize compass;
@synthesize heading;

- (void)locationManager:(CLLocationManager *)manager
         didUpdateHeading:(CLHeading *)newHeading {
   
    heading.text = [NSString stringWithFormat:@"%.2f degrees",
                       newHeading.magneticHeading];
   
    //---headings is in degrees---
    double d = newHeading.magneticHeading;
   
    //---convert degrees to radians---
    double radians = d / 57.2957795;
   
    compass.transform = CGAffineTransformMakeRotation(-radians);
}

- (void)viewDidLoad
{
    lm = [[CLLocationManager alloc] init];
    lm.delegate = self;
    lm.desiredAccuracy = kCLLocationAccuracyBest;
    lm.distanceFilter = kCLDistanceFilterNone;
    [lm startUpdatingLocation];
   
    //---get the compass readings---
    [lm startUpdatingHeading];
   
    //---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)dealloc {
    [compass release];   
    [heading release];       
    [mapView release];
    [lm stopUpdatingLocation];
    [lm release];
    [latitudeTextField release];
    [longitudeTextField release];
    [accuracyTextField release];
    [super dealloc];
}

(6) 如果还没有在项目中添加CoreGraphics.framework,则添加该框架(在SDK的beta版本中,默认不添加该框架)。

(7) 按Command+R组合键,在实际的iPhone设备上测试应用程序。观察在改变设备方向时图像的变化,如图20-14所示。


 

示例说明

获取方向信息与获取位置数据类似,也要使用Core Location框架。但是,调用的不是CLLocationManager对象的startUpdatingLocation方法,而是“startUpdatingHeading”方法:
    //---get the compass readings---
    [lm startUpdatingHeading];
获得方向信息之后,会不断触发“locationManager:didUpdateHeading:”方法:
- (void)locationManager:(CLLocationManager *)manager
         didUpdateHeading:(CLHeading *)newHeading {
   
    heading.text = [NSString stringWithFormat:@"%.2f degrees",
                       newHeading.magneticHeading];
   
    //---headings is in degrees---
    double d = newHeading.magneticHeading;
   
    //---convert degrees to radians---
    double radians = d / 57.2957795;
   
    compass.transform = CGAffineTransformMakeRotation(-radians);

CLHeading参数的magneticHeading属性将包含使用度数作为单位的读数,0表示磁北极。Image View视图中的图像会根据方向的值发生旋转。注意,对于CGAffineTransform- MakeRotation()方法,需要将度数转换为弧度。

 

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:20.2.2 使用地图显示位置
下一篇:20.2.4 旋转地图
相关文章
图文推荐
1.3.5 有限的屏幕尺
1.2 必备条件
精通iOS开发 : 第7版
3.5 iFunBox
排行
热门
文章
下载
读书

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