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 (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property float _latitude; // 經度值
@property float _longitude; //緯度值
@property (nonatomic, copy) NSString *_titleString; //title值
@property
- (id) initWithTitle:(NSString *)atitle latitue:(float)alatitude longitude:(float)alongitude;
@end
---------------------
.m
@implementation LocationObject
@synthesize coordinate,_latitude,_longitude,_titleString,_subTitleString;
- (id) initWithTitle:(NSString
{
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 floatValue] longitude:[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];
}