MKMapView放大后,MKPinAnnotationView失去了pinColor

时间:2012-10-09 16:53:28

标签: ios mkmapview mkannotationview

我有一个MKMapView,其中包含许多从解析器xml定义的注释引脚;多数民众赞成我的代码:

-(IBAction)LoadAnnotation:(id)sender {

    RXML element ...
    RXML iterate....

    [myMap removeAnnotations:myMap.annotations];
    annotation.title = // NSString from RXML parser
    annotation.subtitle = // NSString from RXML parser
    myValue = // float value from RXML parser
    [mymap addAnnotation:annotation];
}

然后

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation2 {

       MKPinAnnotationView *pinView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation2 reuseIdentifier:@"MyPin"];

        if ( myValue > 0 && myValue < 10) {
            pinView.canShowCallout = YES;
            pinView.pinColor = MKPinAnnotationColorRed;
            pinView.animatesDrop=YES;
            return pinView;
        }

        else if ( myValue > 10 && myValue < 20 ) {
        pinView.canShowCallout = YES;
        pinView.pinColor = MKPinAnnotationColorGreen;
        pinView.animatesDrop=YES;
        return pinView;
    }

        pinView.canShowCallout = YES;
        pinView.pinColor = MKPinAnnotationColorPurple;
        pinView.animatesDrop=YES;
        return pinView;
}

好吧,当我的MKMapView加载时,我可以看到标题注释,字幕注释和所有不同颜色的引脚。

但是如果我在某个级别滚动并放大地图,然后再次缩小OUT,所有的针脚都变得紫色。那里发生了什么?

我也尝试在两种方法中使用相同的“注释”(id)(而不是“注释”和“注释2”),但我没有结果。

有没有办法避免这种情况并在地图滚动和缩放后保留pinColors?

1 个答案:

答案 0 :(得分:1)

viewForAnnotation委托方法不一定只为每个注释调用一次,也不保证按添加注释的顺序调用。如果您将showsUserLocation设置为YES,也会调用用户位置(蓝点)。

缩放或平移地图时,地图视图将再次调用委托方法,因为注释会返回到视图中。那时,您的myValue与地图请求查看的注释无关。

而不是使用类级别的ivar,添加myValue作为注记类的属性,并将其与titlesubtitle一起设置你打电话给addAnnotation

annotation.title = // NSString from RXML parser
annotation.subtitle = // NSString from RXML parser
annotation.myValue = // float value from RXML parser
^^^^^^^^^^^

然后在viewForAnnotation中,使用myValue参数中的annotation属性而不是ivar。这样,委托方法始终使用特定于其请求视图的注释的信息:

if ( ! [annotation isKindOfClass:[MyCustomAnnotationClass class]])
{
    return nil;  //return a default view if not your custom class
}

//cast annotation to custom class so we can get the custom property...
MyCustomAnnotationClass *myPin = (MyCustomAnnotationClass *)annotation;

//use the custom property in the annotation instead of ivar...
if (myPin.myValue > 0 && myPin.myValue < 10) {
    ....

无需将annotation参数的名称更改为annotation2


不相关但您应该使用dequeueReusableAnnotationViewWithIdentifier(在SDK或SO上搜索它)来实现注释视图重用。如果有很多注释,它可以帮助提高性能。

<小时/> 您的MyAnnotation课程应如下所示:

@interface MyAnnotation : NSObject <MKAnnotation> {
    float myValue;
}
@property (nonatomic, assign) CLLocationCoordinate2D coordinate; //<-- add
@property (nonatomic, copy) NSString *title;                     //<-- add
@property (nonatomic, copy) NSString *subtitle;                  //<-- add
@property (nonatomic, assign) float myValue;
@end

@implementation MyAnnotation
@synthesize coordinate; //<-- add
@synthesize title;      //<-- add
@synthesize subtitle;   //<-- add
@synthesize myValue;
@end

添加注释的位置应如下所示:

MyAnnotation *annotation = [[MyAnnotation alloc] init];
annotation.title = someTitle;       // NSString from RXML parser
annotation.subtitle = someSubTitle; // NSString from RXML parser
annotation.myValue = someValue;     // someValue from RXML parser
[mapView addAnnotation:annotation];

在上方,someValue是原始myValueViewController的内容。

此外,在viewForAnnotation中,将annotation2更改回annotation,并且不要忘记将MKPinAnnotationView *pinView =[[MKPinAnnotationView alloc] init...放在MyAnnotation *myPin = ...行之前。