【问题标题】:MKPinAnnotationView pinColorMKPinAnnotationView pin颜色
【发布时间】:2012-11-07 20:37:24
【问题描述】:
我无法弄清楚为什么与 MKPointAnnotation 关联(理论上)的 MKPinAnnotationView 没有出现在地图上。事实上,图钉出现了,但它不是应有的紫色......
代码如下:
MKPointAnnotation *myPersonalAnnotation= [[MKPointAnnotation alloc]init];
myPersonalAnnotation.title= [appDelegate.theDictionary objectForKey:@"theKey"];
myPersonalAnnotation.coordinate=CLLocationCoordinate2DMake(6.14, 10.7);
MKPinAnnotationView *myPersonalView=[[MKPinAnnotationView alloc] initWithAnnotation:myPersonalAnnotation reuseIdentifier:@"hello"];
myPersonalView.pinColor=MKPinAnnotationColorPurple;
[myMap addAnnotation:myPersonalAnnotation];
【问题讨论】:
标签:
ios
mapkit
mkpinannotationview
【解决方案1】:
如果你想创建一个不同于默认红色图钉的注解视图,你必须在地图视图的viewForAnnotation委托方法中创建并返回它。
只要地图需要显示一些注释(内置用户位置或您添加的注释),地图就会自动调用 viewForAnnotation 委托方法。
从调用addAnnotation 之前删除myPersonalView 的本地创建,并改为实现viewForAnnotation 方法。
例如:
//in your current method...
MKPointAnnotation *myPersonalAnnotation= [[MKPointAnnotation alloc]init];
myPersonalAnnotation.title= [appDelegate.theDictionary objectForKey:@"theKey"];
myPersonalAnnotation.coordinate=CLLocationCoordinate2DMake(6.14, 10.7);
[myMap addAnnotation:myPersonalAnnotation];
//...
//add the viewForAnnotation delegate method...
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
//if annotation is the user location, return nil to get default blue-dot...
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
//create purple pin view for all other annotations...
static NSString *reuseId = @"hello";
MKPinAnnotationView *myPersonalView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseId];
if (myPersonalView == nil)
{
myPersonalView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId];
myPersonalView.pinColor = MKPinAnnotationColorPurple;
myPersonalView.canShowCallout = YES;
}
else
{
//if re-using view from another annotation, point view to current annotation...
myPersonalView.annotation = annotation;
}
return myPersonalView;
}
确保地图视图的 delegate 属性已设置,否则不会调用委托方法。
在代码中,使用myMap.delegate = self;(例如viewDidLoad)或者如果myMap 是IBOutlet,则在Interface Builder 中建立连接。