您的位置:首页 > 移动开发 > IOS开发

ios 地图 自定义标注

2013-05-28 17:42 761 查看
MKMapView学习笔记(转)  
一.基本知识  
     目前主流的智能手机大部分都支持GoogleMap地图程序,而手机上的地图程序确实能给我们的出行带来很大的方便。在iPhone中利用MapKit框架可以很方便的显示Google地图,并且可以在地图上添加标注。  
  
二.具体介绍  
  
1.MKMapView的显示  
  
(1)创建MKMapView  
CGRect rect = CGRectMake(0, 20, 320, 460);  
MKMapView *mapView = [[MKMapView alloc] initWithFrame:rect];  
(2)设定经纬度  
CLLocationCoordinate2D theCoordinate;  
theCoordinate.latitude=24.148926;  
theCoordinate.longitude=120.715542;  
(3)设定显示范围  
MKCoordinateSpan theSpan;  
theSpan.latitudeDelta=0.1;  
theSpan.longitudeDelta=0.1;  
(4)设置地图显示的中心及范围  
MKCoordinateRegion theRegion;  
theRegion.center=theCoordinate;  
theRegion.span=theSpan;  
(5)设置地图显示的类型及根据范围进行显示  
[mapView setMapType:MKMapTypeStandard];  
[mapView setRegion:theRegion];  
完成这些步骤,再把mapView添加到当前view中就可以显示了。  
  
2.在MKMapView上添加标注  
(1)和标注相关的类及协议  
       (a)MKAnnotation Protocol  
              标注必须实现这个协议,有三个属性,coordinate,title和subtitle,其中coordinate属性必须设置。  
              @property (nonatomic, readonly) CLLocationCoordinate2D coordinate  
     (b)MKAnnotationView  
              设置好Annotation后就可以用这个把标注在地图上显示出来,     
- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier  
              其比较重要的属性有  
@property (nonatomic, retain) UIImage *image  
自定义在地图上标注的图片  
  
@property (nonatomic) BOOL canShowCallout  
设置点击后能否弹出标注  
  
@property (retain, nonatomic) UIView *rightCalloutAccessoryView  
property (retain, nonatomic) UIView *leftCalloutAccessoryView  
设置在标注的左右边点击后进一步弹出附属的View  
  
(c)MKPinAnnotationView  
  
这是以大头针的方式显示标注,继承自MKAnnotationView,同时添加了两个属性  
@property (nonatomic) MKPinAnnotationColor pinColor  
设置大头针的颜色,有红绿紫三种颜色可选择  
  
@property (nonatomic) BOOL animatesDrop  
设置大头针是否以掉下来的动画方式显示  
  
(2)在地图上添加Annotation的步骤  
    (a)创建一个实现MKAnnotation协议的类,在该类的初始化函数中给其coordinate属性设置  
    (b)用上述方法创建Annotation  
    (c)把创建的Annotation用addAnnotation的方法添加到MapView中  
    (d)实现MKMapViewDelegate代理,在代理函数  
  
- (MKAnnotationView *)mapView:(MKMapView *)mView viewForAnnotation:(id <MKAnnotation>)annotation中把Annotation以MKPinAnnotationView或MKAnnotationView的方式标注在地图上上显示。

一、创建、添加和删除注解  
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];   


正向、反向地理编码

(1)正向 (根据地理位置得到位置的坐标信息)
- (void)geocodeAddressDictionary:(NSDictionary *)addressDictionary completionHandler:(CLGeocodeCompletionHandler)completionHandler;
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;
- (void)geocodeAddressString:(NSString *)addressString inRegion:(CLRegion *)region completionHandler:(CLGeocodeCompletionHandler)completionHandler;

(2)反向 (根据坐标信息 得到城市等地理信息)
- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

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 (nonatomic, copy) 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  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  地图 mkmapview