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