mkmapview MKUserLocation AnnotationView
Posted
技术标签:
【中文标题】mkmapview MKUserLocation AnnotationView【英文标题】: 【发布时间】:2013-03-19 08:47:15 【问题描述】:我正在尝试为我的地图上的注释创建自定义注释视图。我通过调整协议MKMapViewDelegate
并覆盖函数mapView:viewForAnnotation:
来做到这一点。一切正常,唯一的问题是我还将showsUserLocation
设置为TRUE
,这意味着我在mapView:viewForAnnotation:
方法中获得的一个“注释”属于MKUserLocation
类。
我不希望用户位置注释有我的自定义注释视图,我希望那个显示默认的用户位置注释视图!如何返回用户位置的默认用户位置注释视图或将其从注释中排除(来自mapView:viewForAnnotation:
)?
我尝试在mapView:viewForAnnotation:
方法中捕获UserLocation,但我不知道返回什么! (在这个例子中,我返回一个标准的 MKAnnotationView,但这看起来不像默认的 UserLocation Annotation(显然。)
if (![[annotation class] isEqual:[MKUserLocation class]])
MKAnnotationView *view = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"customAnnotation"];
// edit the custom view
return view;
MKAnnotationView *view = [[MKAnnotationView alloc] init];
return view;
【问题讨论】:
请编写您在 mapView:viewForAnnotation 中实现的代码 【参考方案1】:要显示用户位置的默认注释,只需在这种情况下返回 nil
,我就是这样做的:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
// use your custom annotation
if ([annotation isKindOfClass:[MyAnnotationClass class]])
...
return annotationView;
// use default annotation
return nil;
【讨论】:
答对了三次,但这是最中肯的;只为默认注释返回 nil 。谢谢!【参考方案2】:在您的 viewForAnnotation 方法中编写这段代码。这里的 var 'map' 是您的 MKMapview 的出口;
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation
//Annoation View for current Location
if(map.userLocation != annotation)
UIImage *image = [UIImage imageNamed:@"image.png"];
annotation.image = image;
return annotation;
//Annotation View for current location
return nil;
【讨论】:
【参考方案3】:创建自定义AnnotationView
:
#import <MapKit/MapKit.h>
@interface AnnotationView : MKPlacemark
@property (nonatomic, readwrite, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *subtitle;
// you can put here any controllers that you want. (such like UIImage, UIView,...etc)
@end
在.m file
#import "AnnotationView.h"
@implementation AnnotationView
- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate addressDictionary:(NSDictionary *)addressDictionary
if ((self = [super initWithCoordinate:coordinate addressDictionary:addressDictionary]))
self.coordinate = coordinate;
return self;
@end
// 使用注解在你的相关.m file
中添加#import "AnnotationView.h"
:
CLLocationCoordinate2D pCoordinate ;
pCoordinate.latitude = LatValue;
pCoordinate.longitude = LanValue;
// Create Obj Of AnnotationView class
AnnotationView *annotation = [[AnnotationView alloc] initWithCoordinate:pCoordinate addressDictionary:nil] ;
annotation.title = @"I m Here";
annotation.subtitle = @"This is Sub Tiitle";
[self.mapView addAnnotation:annotation];
以上是如何创建AnnotationView
的简单示例。
【讨论】:
【参考方案4】:如果 annotation 参数中的对象是 MKUserLocation 类的实例,您可以提供自定义视图来表示用户的位置。要使用默认系统视图显示用户的位置,请返回 nil。 如果您不实现此方法,或者如果您从您的实现中为用户位置注释以外的注释返回 nil,则地图视图将使用标准引脚注释视图。
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation
// if it's the user location, just return nil or custom annotation view.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
else
//return other annotations
【讨论】:
以上是关于mkmapview MKUserLocation AnnotationView的主要内容,如果未能解决你的问题,请参考以下文章