1. 程式人生 > >iphone開發-地圖註解(地圖上的大頭針)

iphone開發-地圖註解(地圖上的大頭針)

Cocoa Touch 沒有提供地圖註解類,只定義了一個 MKAnnotation 協議。要建立地圖註解,必須設計符合 MKAnnotation 協議的類,該類需要一個 CLLocationCoordinate2D coordinate 屬性,以及  title 和 subtitle 例項方法,

一. 設計註解類:

例,註解(大頭針)類:

.h

#import <MapKit/MapKit.h>

@interface LocationObject : NSObject <MKAnnotation> {

CLLocationCoordinate2D coordinate

;

NSString *_titleString; //title

NSString *_subTitleString;

float _latitude; // 經度值

float _longitude; //緯度值

}

@property (nonatomicreadonly) CLLocationCoordinate2D coordinate;

@property float _latitude; // 經度值

@property float _longitude; //緯度值

@property (nonatomiccopy) NSString *_titleString; //title

@property

 (nonatomiccopy) NSString *_subTitleString;

- (id) initWithTitle:(NSString *)atitle latitue:(float)alatitude longitude:(float)alongitude;

@end

---------------------

.m

@implementation LocationObject

@synthesize coordinate,_latitude,_longitude,_titleString,_subTitleString;

- (id) initWithTitle:(NSString

 *)atitle latitue:(float)alatitude longitude:(float)alongitude

{

if(self=[super init])

{

self._titleString = atitle;

self._latitude = alatitude;

self._longitude = alongitude;

}

return self;

}

- (CLLocationCoordinate2D)coordinate;

{

    CLLocationCoordinate2D currentCoordinate;

currentCoordinate.latitude = self._latitude ;

    currentCoordinate.longitude = self._longitude;

    return currentCoordinate; 

}

// required if you set the MKPinAnnotationView's "canShowCallout" property to YES

- (NSString *)title

{

return self._titleString;

}

// optional

- (NSString *)subtitle

{

 return _subTitleString;

}

- (void)dealloc

{

[_titleString release];

[_subTitleString release];

    [super dealloc];

}

@end

二、建立、新增和刪除註解

1、建立註解:

LocationObject *aLocationObject = [[LocationObject alloc]initWithTitle:nameString latitue:[latitudeString floatValuelongitude:[longitudeString floatValue]];

aLocationObject._subTitleString = addressString;

2、添加註解:

先構建一個註解陣列 NSMutableArray *_mapAnnotations;

然後

[self._mapAnnotations addObject:aLocationObject];

[self._mapView addAnnotations:self._mapAnnotations];

3、刪除註解:

刪除註解可執行 removeAnnotation:一次只刪除一個註解,或者執行 removeAnnotation:刪除一個數組中的所有項。

如果需要使地圖檢視回到無註解狀態,可執行:

[self._mapView removeAnnotations:self._mapView.annotations];

刪除其中全部註解,MKMapView  annotations 屬性獲取了所有註解的陣列,然後從地圖上全部刪除。

三、註解檢視 

註解物件並非檢視,是描述註解的抽象類。註解檢視是屬於 MKAnnotationView 的子類 MKPinAnnotationView,當地圖通過 addAnnotation:或 addAnnotations:添加了註解後,MKMapViewDelegate 協議的委託方法 -  (void)mapView:(MKMapView *)mapViewdidAddAnnotationViews:(NSArray *)views 就會通知委託,可以在此回撥方法裡設定註解檢視,如設定大頭針顏色、新增附屬按鈕等,例:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views

{

// Initialize each view

for (MKPinAnnotationView *mkaview in views)

{

// 當前位置 的大頭針設為紫色,並且沒有右邊的附屬按鈕

if ([mkaview.annotation.title isEqualToString:@"當前位置"]) 

{

mkaview.pinColor = MKPinAnnotationColorPurple;

mkaview.rightCalloutAccessoryView = nil;

continue;

}

// 其他位置的大頭針設為紅色,右邊新增附屬按鈕

mkaview.pinColor = MKPinAnnotationColorRed;

UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

mkaview.rightCalloutAccessoryView = button;

}

}

四、註解檢視 MKPinAnnotationView 的幾個屬性說明

newAnnotation.animatesDrop = YES;  //  大頭針掉落的動畫開啟,NO-關閉

newAnnotation.canShowCallout=YES;  // 控制輕擊按鈕是否生成一個註解檢視,預設為Yes-開啟

newAnnotation.pinColor    //  設定大頭針顏色,一共有三種顏色:紅色(MKPinAnnotationColorRed),綠色(MKPinAnnotationColorGreen),紫色(MKPinAnnotationColorPurple

五、自動顯示註解檢視(Callout)

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

{

。。。。。。

///// 自動顯示 Callout

_myAnnotation = annotation;

[self performSelector:@selector(showCallout) withObject:selfafterDelay:0.1];

  return newAnnotation;

}

- (void)showCallout {

    [self._mapView selectAnnotation:_myAnnotation animated:YES]; 

}