2009-12-18 41 views
3

我成功地在MKAnnotationView上设置了一个自定义图像来代替引脚(我使用了功能setImage)。 但它只适用于MKMapView类型为“标准”。卫星和混合模式总是显示引脚。MKAnnotationViews卫星地图模式下的图像

有没有人有想法解决这个奇怪的问题?

回答

0

奇怪的是,这两个主题(自定义MKAnnotationView和地图模式)没有链接在一起。

更换销的方式似乎很奇怪(setImage?),“经典”的方式,是落实

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation

,并返回在您的代理自定义注释,以便履行MKMapViewDelegate协议。

0

要扩大yonel的答案,您不能只使用已创建的MKAnnotationView.image属性的setImage在MapViewController的主要部分中为其设置新图像。

的MapViewController中必须实施的MKMapViewDelgate方法:

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation 

在这里面,你会被从地图通知时添加的注释。

因此,为了剪裁您的annotationView,您应该扩展MKAnnotation并创建自己的注记类。您只需添加此自定义注释实例以让您的mapView自动显示此注释类型(即类)的自定义(扩展,即您自己的)注释视图。

也就是说,委托方法会通知您添加了自定义注释,因此您在那里检查注记类,如果它是您的注记类,则创建自定义注记视图的新实例。

也就是说,要使用init方法本customAnnotation类为:

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)identifier 

你必须自己实现这个方法。

在这种方法中,你可以使用setImage来设置你喜欢的任何图像。这将用于此注释视图。

我猜在你的使用中,当MapType被改变时设置的图像被擦掉了,大概这是因为它为地图创建了一个annotationView的新实例(这是一个新的地图并且再次添加注释并且从委托方法重新创建annnotationViews)。

如果您在init方法中设置图像,它将不会丢失(因为它始终为实例设置)。

这有帮助吗?

2

当我尝试更改MKPinAnnotationView的图像时,我遇到了完全相同的问题。看起来,对setImage的调用并不是持久的,因为mapView现在和当时都会使用默认图像调用setImage。解决的办法是继承MKPinAnnotationView并覆盖setImage总是设置你的自定义图像:

- (void)setImage:(UIImage *)image { 
    [super setImage:[UIImage imageNamed:@"MyCustomPinImage.png"]]; 
}