4

我无法显示注释标题,如下图所示。第一张图片很好地表示了价值;另一方面,一旦值上升到三位数,则标题显示三个点,如第二张图片所示。我想知道如何解决这个问题。任何想法都会受到欢迎!提前非常感谢,不胜感激!我刚刚把我的代码放在这里供参考!

- (MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation {
   MKAnnotationView *pinView=nil;
    if(![annotation isKindOfClass:[Annotation class]]) // Don't mess user location
        return nil;

    static NSString *defaultPinID = @"StandardIdentifier";
    pinView = (MKAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
    if (pinView == nil){
        pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID];
    }

    if ([annotation isKindOfClass:[Annotation class]]) {
        Annotation *a = (Annotation *)annotation;

        pinView.image = [ZSPinAnnotation pinAnnotationWithColor:a.color];
        pinView.annotation = a;
        pinView.enabled = YES;
        pinView.centerOffset=CGPointMake(6.5,-16);
        pinView.calloutOffset = CGPointMake(-11,0);

    }

    pinView.canShowCallout = YES;
    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [rightButton setTitle:annotation.title forState:UIControlStateNormal];
    [pinView setRightCalloutAccessoryView:rightButton];
    pinView.leftCalloutAccessoryView = [[UIView alloc] init];
    pinView.leftCalloutAccessoryView=nil;

    return pinView;
  }

我的 showCallout 标题在以下代码中更新:

NSNumber *attr2=[attr valueForKey:@"ozone_level"];
annotation.title=[NSString stringWithFormat:@"Ozone Level:%@",[attr2 stringValue]];

在此处输入图像描述 在此处输入图像描述

4

2 回答 2

2

问题是当标题更改时,标注视图的布局不会重新计算。也许您应该为此提交错误报告。

要强制重新布局,如果标注可见,您可以取消选择并以编程方式选择注释。它不是动画的,但它改变了标注的宽度:

NSNumber *attr2=[attr valueForKey:@"ozone_level"];
annotation.title=[NSString stringWithFormat:@"Ozone Level:%@",[attr2 stringValue]];


if ([self.mapView viewForAnnotation:annotation] != nil) {
    NSArray *selectedAnnotations = self.mapView.selectedAnnotations;
    if ((selectedAnnotations != nil) && ([self.mapView.selectedAnnotations indexOfObject:annotation] != NSNotFound)) {
        [self.mapView deselectAnnotation:annotation animated:NO];
        [self.mapView selectAnnotation:annotation animated:NO];
    }
}

您还应该删除此行,因为注释的标题无论如何都用作注释上的文本标签:

[rightButton setTitle:annotation.title forState:UIControlStateNormal];

更新:

@detunized 提供的解决方案适用于动画。不过,您可以更好地删除并重新添加按钮视图,而不是创建不需要的 UIView:

NSNumber *attr2=[attr valueForKey:@"ozone_level"];
annotation.title=[NSString stringWithFormat:@"Ozone Level:%@",[attr2 stringValue]];

MKAnnotationView *annotationView = [self.mapView viewForAnnotation:annotation];
// The annotation must be visible, otherwise a refresh isn't needed
if (annotationView != nil) {
    NSArray *selectedAnnotations = self.mapView.selectedAnnotations;
    // The annotation must be selected, otherwise a refresh isn't needed
    if ((selectedAnnotations != nil) && ([self.mapView.selectedAnnotations indexOfObject:annotation] != NSNotFound)) {
            // Unset and re-set the right button to force relayout
            UIView *view = annotationView.rightCalloutAccessoryView;
            annotationView.rightCalloutAccessoryView = nil;
            annotationView.rightCalloutAccessoryView = view;
    }
}
于 2012-11-12T17:09:09.243 回答
0

我不知道这个问题的正确解决方案,但我有一个 hacky 给你。您需要触发视图的重新布局,这可以通过弄乱附件视图来实现。您在这里没有使用左附件视图,因此您可以将其设置为某物并将其设置回nil. 像这样:

self.pin.title = @"Ozone Level: 100";
self.pin_view.leftCalloutAccessoryView = [[[UIView alloc] init] autorelease];
self.pin_view.leftCalloutAccessoryView = nil;

我试过了,它适用于 iOS 5。无法在 iOS 6 上测试。

如果你经常这样做,那么最好不要一直创建UIView,而是重用一些东西。

我在更新时遇到了同样的问题rightCalloutAccessoryView。仅当我首先将其设置为nil然后立即将其设置为我首先需要的任何内容时才有效。

于 2012-11-08T00:10:21.103 回答