1. 添加到map view的子視圖不會隨地圖的移動而移動,map view會固定其子視圖的位置。如果要添加隨著地圖移動的子視圖,可以使用annotations和overlays。annotation用來顯示由一個經緯度定義的位置,而overlay則是由多個點所定義或者包含了許多連續的圖形。
2.在地圖上顯示annotation,需要提供兩個對象
annotation object)
annotation view.)
注釋對象通常是一些小的數據對象,保存了地圖的坐標和一些相關信息。
Map Kit提供了一些標准的注釋視圖,你也可以使用自定義的注釋視圖。但是不能將注釋視圖直接添加到map view,而是使用map view的代理對象來提供。
3.添加注釋的具體步驟
定義一個注釋對象annotation object :
使用MKPointAnnotation類來實現一個簡單的注釋,這類注釋可以顯示標題和副標題。
自定義一個遵守MKAnnotation協議的對象,這類注釋可以存儲任何類型數據
定義一個注釋視圖annotation view來顯示數據:
如果注釋可以由一張靜態圖片表示,則創建一個MKAnnotationView類的實例,然後將圖像賦值給image屬性
如果你想使用標准的pin annotation,創建一個MKPinAnnotationView類的實例
如果靜態圖像不夠表示你的注釋,那麼創建一個MKAnnotationView的子類
Implement the mapView:viewForAnnotation: method in your map view delegate. Your implementation of this method should dequeue an existing annotation view if one exists or create a new one. If your application supports multiple types of annotations, you must include logic in this method to create a view of the appropriate type for the provided annotation object. 在map view的代理對象中實現mapView:viewForAnnotation:方法,使用已經存在的注釋視圖或者新創建一個。如果你的程序支持多種不同的注釋,那麼應該根據不同的注釋提供不同的視圖
方法添加你的注釋對象到map view
4.自定義注釋對象
注釋對象遵守MKAnnotation協議,如果你之想要將一個標題和一個坐標相聯系,那麼可以直接使用MKPointAnnotation作為注釋對象。如果還想要顯示其他信息,就需要自定義一個注釋對象
<span style="font-size:16px;">Listing 5-1 Creating a simple annotation object
@@interface MyCustomAnnotation : NSObject <MKAnnotation> {
CLLocationCoordinate2D coordinate;
}
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
- (id)initWithLocation:(CLLocationCoordinate2D)coord;
// Other methods and properties.
@end </span>
<span style="font-size:16px;">@implementation MyCustomAnnotation
@synthesize coordinate;
- (id)initWithLocation:(CLLocationCoordinate2D)coord {
self = [super init];
if (self) {
coordinate = coord;
}
return self;
}
@end </span>
5.使用標准注釋視圖
MKAnnotationView類定義了注釋視圖的一些基本特性。MKPinAnnotationView類是MKAnnotationView的子類,用來顯示系統標准的注釋視圖(pin view)
創建一個MKAnnotationView的實例,設置image屬性。當此annotation顯示在地圖上時,該圖像顯示在相應的坐標位置(If you do not want the image to be centered on the map coordinate, you can use the centerOffset property to move the center point horizontally and vertically in any direction. )。
<span style="font-size:16px;">MKAnnotationView* aView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:@"MyCustomAnnotation"] autorelease];
aView.image = [UIImage imageNamed:@"myimage.png"];
aView.centerOffset = CGPointMake(10, -20); </span>
在代理的mapView:viewForAnnotation:方法中創建標准注釋視圖
6.使用自定義注釋視圖
<span style="font-size:16px;">#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface MyCustomAnnotationView : MKAnnotationView
{
// Custom data members
}
// Custom properties and methods.
@end </span>
<span style="font-size:16px;">Listing 5-5 Initializing a custom annotation view
- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self)
{
// Set the frame size to the appropriate values.
CGRect myFrame = self.frame;
myFrame.size.width = 40;
myFrame.size.height = 40;
self.frame = myFrame;
// The opaque property is YES by default. Setting it to
// NO allows map content to show through any unrendered
// parts of your view.
self.opaque = NO;
}
return self;
} </span>
6.在代理對象中創建注釋視圖 www.2cto.com
<span style="font-family:Arial;color:#333333;"><span style="font-size:16px;">Listing 5-6 Creating annotation views
- (MKAnnotationView *)mapView:(MKMapView *)mapView
viewForAnnotation:(id <MKAnnotation>)annotation
{
// If it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
// Handle any custom annotations.
if ([annotation isKindOfClass:[MyCustomAnnotation class]])
{
// Try to dequeue an existing pin view first.
MKPinAnnotationView* pinView = (MKPinAnnotationView*)[mapView
dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];
if (!pinView)
{
// If an existing pin view was not available, create one.
pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:@"CustomPinAnnotation"]
autorelease];
pinView.pinColor = MKPinAnnotationColorRed;
pinView.animatesDrop = YES;
pinView.canShowCallout = YES;
// Add a detail disclosure button to the callout.
UIButton* rightButton = [UIButton buttonWithType:
UIButtonTypeDetailDisclosure];
[rightButton addTarget:self action:@selector(myShowDetailsMethod:)
forControlEvents:UIControlEventTouchUpInside];
pinView.rightCalloutAccessoryView = rightButton;
}
else
pinView.annotation = annotation;
return pinView;
}
return nil;
} </span></span>
當map view需要顯示注釋時候,會調用代理的mapView:viewForAnnotation:方法,如果你不實現此方法或者總是返回nil,map view會使用默認的注釋視圖,即pin annotation view。在你創建新的視圖之前,檢查是否已經存在此類視圖dequeueReusableAnnotationViewWithIdentifier: ,類似於tableview的cell實現
7.管理地圖的注釋對象
為了避免注釋視圖的重疊,在方法mapView:regionWillChangeAnimated: andmapView:regionDidChangeAnimated: 中,根據需要來添加或者減少
8.讓注釋視圖可拖動
在注釋對象中,實現setCoordinate:方法來更新注釋的坐標。
創建注釋視圖時,設置draggable屬性為YES
摘自 nerohoop的專欄