我有一个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?
答案 0 :(得分:1)
viewForAnnotation
委托方法不一定只为每个注释调用一次,也不保证按添加注释的顺序调用。如果您将showsUserLocation
设置为YES
,也会调用用户位置(蓝点)。
缩放或平移地图时,地图视图将再次调用委托方法,因为注释会返回到视图中。那时,您的myValue
与地图请求查看的注释无关。
而不是使用类级别的ivar,添加myValue
作为注记类的属性,并将其与title
和subtitle
一起设置你打电话给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
是原始myValue
中ViewController
的内容。
此外,在viewForAnnotation
中,将annotation2
更改回annotation
,并且不要忘记将MKPinAnnotationView *pinView =[[MKPinAnnotationView alloc] init...
放在MyAnnotation *myPin = ...
行之前。