1

我有一个 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 被加载时,我可以看到标题注释、副标题注释和所有不同颜色的图钉。

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

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

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

4

1 回答 1

1

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

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

不要使用类级别的 ivar,而是将其添加myValue为注释类的属性,并在调用之前将其与titleand一起设置:subtitleaddAnnotation

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];

以上,someValuemyValue您原来的ViewController.

此外,在 中viewForAnnotation,更改annotation2annotation并且不要忘记放在行MKPinAnnotationView *pinView =[[MKPinAnnotationView alloc] init...MyAnnotation *myPin = ...

于 2012-10-09T17:21:59.003 回答