iOS 8 MKAnnotationView rightCalloutAccessoryView未alignment

一般来说,我对iOS的东西还很新,在testing我们的应用程序以获得iOS 8兼容性时发现问题。 在iOS 7中,一切工作正常,但在iOS 8上,在某些情况下,RightCalloutAccessoryView错位。

第一个屏幕截图:正确alignment 正确对齐

第二个屏幕截图:错误alignment 错误的对齐

正如你所看到的,当InfoWindow拥有一个长标题时,问题就会发生。 但iOS 7并非如此,我找不到任何提及这一点的内容?

我试图理解为什么,并find一种方法来解决这个问题,但还找不到任何东西。 这是可以自行解决的,还是我们必须为苹果提出问题?

任何帮助/想法将高度赞赏,因为我在某种程度上被这个问题挑战。

添加MKAnnotationView的代码

- (MKAnnotationView *)viewForStation:(id<MKAnnotation>)annotation { static NSString *stationIdentifier = @"stao"; MKAnnotationView *annotationView = [self.mapView dequeueReusableAnnotationViewWithIdentifier:stationIdentifier]; if (annotationView == nil) { annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:stationIdentifier]; annotationView.image = [UIImage bundleImageNamed:PIN_IMAGE]; annotationView.canShowCallout = YES; annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; } return annotationView; } 

正如你可能感兴趣的,我(刚才)也把这个问题添加到apple.developer.com上的iOS 8 Beta部分: https ://devforums.apple.com/thread/242282 ? tstart = 0

如果我在这里或在apple.developer.com上得到一个答案,我将反映它,所以我们可以在这两个网站上find它

我通过设置autoresizingmask来修正水平错误的垂直错误和frame.size.width来解决这个问题

 UIButton* infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; [infoButton setFrame:CGRectMake(0, 0, CGRectGetWidth(infoButton.frame)+10, CGRectGetHeight(infoButton.frame))]; [infoButton setAutoresizingMask:UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleTopMargin]; [annotationView setRightCalloutAccessoryView:infoButton]; 

丑陋的,但我设法find解决这个问题。

将附件视图高度设置为与标注视图高度相等的值。 我使用硬编码的值:

  • 对于iOS 7的目标:45.0像素
  • 对于iOS 8的目标:54.0像素

(您可能已经注意到iOS 8中默认注释标注视图的高度大于iOS 7)。

在你的代码中,这将是:

 - (MKAnnotationView *)viewForStation:(id<MKAnnotation>)annotation { static NSString *stationIdentifier = @"stao"; MKAnnotationView *annotationView = [self.mapView dequeueReusableAnnotationViewWithIdentifier:stationIdentifier]; if (annotationView == nil) { annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:stationIdentifier]; annotationView.image = [UIImage bundleImageNamed:PIN_IMAGE]; annotationView.canShowCallout = YES; UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; // NB In production code, you would need a more generic way to adjust // height values instead of hard-coding values based on NSFoundationVersionNumber... CGFloat height = (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) ? 55.f : 45.f; detailButton.frame = CGRectMake(0.f, 0.f, 32.f, height); annotationView.rightCalloutAccessoryView = detailButton; } return annotationView; } 

此外,从目前为止我所看到的,如果您指定左侧右侧配件视图,则必须将其高度设置为相同的值才能正确alignment。 希望这个问题将在随后的iOS版本中得到解决,以避免编写这种代码…

嗨,我在这里有完全相同的问题是我所做的解决它:

标注视图在显示MKAnnotation标题文本太长时出现问题似乎是个问题。 即使从你的截图中,你可以看到问题只发生在标题已被截断,省略号被添加。 所以标准的MKAnnotation没有正确地布置视图,这是iOS8中的一个错误。

同时,您可以按照此处的步骤创build自己的自定义标注。

我认为这是我所需要的太多的工作,所以我只是修剪标题string,并添加省略号,以防止它自己尝试。 (不理想,但是是一个快速的解决scheme,文本将被截断)

 if (locTitle.length > 15) { locTitle = [NSString stringWithFormat:@"%@...", [locTitle substringToIndex:14]]; } 

我注意到一个好奇心是,我的第一个标注要正确alignment配件视图,但后来的select不会。 在返回出列注解视图之前,我添加了一个对[view setNeedsLayout]的调用,并且所有的事情都开始正确地重新alignment了。

不用花费更多的时间在这个上,我最好的猜测是,重新布局不会被触发,因为视图层次没有改变,因此出现了视图。

我强烈build议尽pipe提交雷达这个问题。 对于这样一个标准的用例来说,没有必要实施解决方法。

编辑:

虽然这在很多情况下似乎还是比较好的,但是我仍然遇到这个问题,标题的长度足以被截断。

就目前而言,我正在隐藏的是CalloutAccessoryView

 pin.rightCalloutAccessoryView.frame = CGRectZero; 

然后点击注释视图仍然工作,只是没有button在右侧。 testingiOS7和iOS8,不知道iOS6。

我通过在添加注释之前设置我的地图视图的委托来工作,而不必在del中更改任何内容。

从以下几点来看:

  self.mapView = [[MKMapView alloc] init]; NGAAnnotation *annotation = [[NGAAnnotation alloc] init]; annotation.coordinate = coordinates; annotation.title = self.project.name; [self.mapView addAnnotation:annotation]; self.mapView.delegate = self; 

至:

  self.mapView = [[MKMapView alloc] init]; NGAAnnotation *annotation = [[NGAAnnotation alloc] init]; annotation.coordinate = coordinates; annotation.title = self.project.name; self.mapView.delegate = self; [self.mapView addAnnotation:annotation]; 

为我修好了。 我注意到,当添加注释时,委托方法被调用,所以如果在添加注释之前未设置委托,它将不会被调用。

在Swift 3:

 let infoButton = UIButton(type: .detailDisclosure) annotationView.rightCalloutAccessoryView = infoButton