读书频道 > 网站 > 网页设计 > iOS 5编程入门经典(第3版)——开发iPhone与iPad应用
20.2.5 显示注记
12-11-08    奋斗的小年轻
收藏    我要投稿   
本书面向iPhone和iPad开发初学者,涵盖了iOS开发的各个主题。本书的编写方式是渐进式的,这样读者就不会由于细节过多而疲于奔命。我认为最好的学习方式就是去实践,因此全书大量的试一试首先会介绍如何构建某个应...立即去当当网订购

到现在为止,已经使用Core Location报告了当前的位置和方向,然后使用Map Kit框架显示了表示所在位置的地图。可以在视觉效果上对这个项目加以改进,在地图上添加一个图钉来表示当前位置。

下面的“试一试”将演示如何在Map Kit框架中向地图添加注记。使用注记可以在地图上显示图钉以表示特定的位置。

 试一试       显示图钉

(1) 继续使用LBS项目,在项目中添加一个新的Objective-C类文件,如图20-20所示。

(2) 将文件命名为MyAnnotation.m。一旦添加完,在项目下就应该看到MyAnnotation.h和MyAnnotation.m文件,如图20-21所示。


 

(3) 在MyAnnotation.h文件中添加如下代码:
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface MyAnnotation : NSObject <MKAnnotation> {
    CLLocationCoordinate2D coordinate;
    NSString *title;
    NSString *subtitle;
}

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, readonly, copy) NSString *title;
@property (nonatomic, readonly, copy) NSString *subtitle;

-(id)initWithCoordinate:(CLLocationCoordinate2D) c
title:(NSString *) t
                  subtitle:(NSString *) st;

@end

(4) 在MyAnnotation.m文件中添加如下代码:
#import "MyAnnotation.h"

@implementation MyAnnotation

@synthesize coordinate;
@synthesize title;
@synthesize subtitle;

- (id)init
{
    CLLocationCoordinate2D location;
    location.latitude = 0;
    location.longitude = 0;
    return [self initWithCoordinate :coordinate
title:nil
                               subtitle:nil];
}

-(id)initWithCoordinate:(CLLocationCoordinate2D) c
title:(NSString *) t
subtitle:(NSString *) st {
    self = [super init];
    coordinate = c;
    title = [t retain];
    subtitle = [st retain];
    return self;
}

- (void) dealloc{
    [title release];
    [subtitle release];
    [super dealloc];
}

@end

(5) 在LBSViewController.h文件中添加如下粗体代码:
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>

#import "MyAnnotation.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;
    IBOutlet UIView *viewForMap;
   
    MyAnnotation *annotation;
}

@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;
@property (nonatomic, retain) UIView *viewForMap;

@end

(6) 在LBSViewController.m文件中添加如下粗体代码:
- (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];   
   
    //---display an annotation here---
    if (!annotation) {
        annotation = [[MyAnnotation alloc]
                        initWithCoordinate:newLocation.coordinate
                        title:@"You are here"
                        subtitle:[NSString
                                stringWithFormat:@"Lat: %@. Lng: %@",
                                latitudeTextField.text,
                                longitudeTextField.text]];
        [mapView addAnnotation:annotation];
    }
}

- (void)dealloc {
    [annotation release];
    [viewForMap release];
    [compass release];   
    [heading release];       
    [mapView release];
    [lm stopUpdatingLocation];
    [lm release];
    [latitudeTextField release];
    [longitudeTextField release];
    [accuracyTextField release];
    [super dealloc];
}

(7) 按Command+R组合键,在iPhone Simulator中测试应用程序。可以看到当前位置插上了一个图钉。轻拍该图钉,会在一个注记视图中显示位置信息,如图20-22所示(见封二彩插)。


 

示例说明

首先创建了MyAnnotation类,它继承自MKAnnotation基类。MyAnnotation类中实现了一些属性(包括指定注记中心点的coordinate),特别是:

● title属性—返回将在注记上显示的标题。

● subtitle属性—返回将在注记上显示的小标题。

获得设备的位置时,显示一个注记来表示当前位置:
    //---display an annotation here---
    if (!annotation) {       
        annotation = [[MyAnnotation alloc]
                         initWithCoordinate:newLocation.coordinate
                         title:@"You are here"
                         subtitle:[NSString
                                    stringWithFormat:@"Lat: %@. Lng: %@",
                                    latitudeTextField.text,
                                    longitudeTextField.text]];
        [mapView addAnnotation:annotation];

要从地图上移除注记,使用MKMapView对象的“removeAnnotation:”方法即可。

 

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

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