gpt4 book ai didi

ios - MKMapView 放大后 MKPinAnnotationView 失去 pinColor

转载 作者:行者123 更新时间:2023-11-29 13:27:18 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

当您缩放或平移 map 时, map View 将在注释返回 View 时(再次)调用委托(delegate)方法。届时,您的 myValue 将与 map 请求查看的注释无关。

不使用类级别的 ivar,添加 myValue 作为注释类的属性,并将其与 titlesubtitle 在调用 addAnnotation 之前:

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

然后在 viewForAnnotation 中,使用 annotation 参数中的 myValue 属性而不是 ivar。这样,委托(delegate)方法总是使用特定于它请求 View 的注释的信息:

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 实现注释 View 重用(在 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 是原始 ViewController 中的 myValue

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

关于ios - MKMapView 放大后 MKPinAnnotationView 失去 pinColor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com