ios - iOS7中MKAnnotationView与其rightCalloutAccessoryView的布局关系发生了变化

标签 ios ios7 mkannotationview

UIButton 被设置为 MKPinAnnotationViewrightCalloutAccessoryView,它会触发 btnClicked: 方法。在iOS6中,MKAnnotationView与其rightCalloutAccessoryView之间的布局关系可以方便的通过MKPinAnnotationView *pin = (MKPinAnnotationView *)[[按钮 super View ] super View ];。但是在iOS7中,布局关系不存在了。

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation{
...

MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:tripStartAddrAnnotationIdentifier];
    if (!pinView)
    {            
        MKPinAnnotationView *customPinView = [[MKPinAnnotationView alloc]
                                              initWithAnnotation:annotation reuseIdentifier:tripStartAddrAnnotationIdentifier];
        customPinView.animatesDrop = NO;
        customPinView.canShowCallout = YES;

        UIButton* rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];
        [rightButton setImage:[UIImage imageNamed:@"disclosureUpMap.png"] forState:UIControlStateNormal];
        [rightButton setImage:[UIImage imageNamed:@"disclosureDownMap.png"] forState:UIControlStateNormal];

        [rightButton addTarget:self
                        action:@selector(btnClicked:)
              forControlEvents:UIControlEventTouchUpInside];
        customPinView.rightCalloutAccessoryView = rightButton;

        return customPinView;
    }
    else
    {
        pinView.annotation = annotation;
    }
    return pinView;
...
}


-(void)btnClicked:(id)sender{
    NSLog(@"superview 1 :%@",[sender superview]);
    NSLog(@"superview 2 :%@",[[sender superview] superview]);
    NSLog(@"superview 3 :%@",[[[sender superview] superview] superview]);
    NSLog(@"superview 4 :%@",[[[[sender superview] superview] superview] superview]);
    MKPinAnnotationView *pin = (MKPinAnnotationView *)[[sender superview] superview];
    // the information contains in pin.annotation is necessary for the pushed view controller
...    
}

iOS6 日志:

2013-09-30 01:21:11.851 MyApp[6113:c07] superview 1 :<UICalloutView: 0x1e3df250; frame = (-246 -60; 320 70); clipsToBounds = YES; layer = <CALayer: 0x1e3e0140>>
2013-09-30 01:21:11.851 MyApp[6113:c07] superview 2 :<MKPinAnnotationView: 0x1b649510; frame = (526 223; 32 39); layer = <MKLayer: 0x1b649570>> visible:1 +33.19910200, +120.45132100
2013-09-30 01:21:11.852 MyApp[6113:c07] superview 3 :<MKAnnotationContainerView: 0xb68b380; frame = (0 0; 640 640); autoresizesSubviews = NO; layer = <CALayer: 0xb68b410>>
2013-09-30 01:21:11.852 MyApp[6113:c07] superview 4 :<MKScrollContainerView: 0xb68c8f0; frame = (-280 -72.5; 640 640); autoresizesSubviews = NO; layer = <CALayer: 0xb68c980>>

iOS7 日志:

2013-09-30 01:44:22.835 MyApp[6226:a0b] superview 1 :<_MKSmallCalloutContainerView: 0xdbe5120; frame = (0 0; 222 44); clipsToBounds = YES; layer = <CALayer: 0xdbe1f30>>
2013-09-30 01:44:22.836 MyApp[6226:a0b] superview 2 :<MKSmallCalloutView: 0x1c53a380; frame = (0 0; 222 57); layer = <CALayer: 0x1c546440>>
2013-09-30 01:44:22.837 MyApp[6226:a0b] superview 3 :<UIView: 0xdb14770; frame = (0 0; 222 57); clipsToBounds = YES; layer = <CALayer: 0xdb147d0>>
2013-09-30 01:44:22.837 MyApp[6226:a0b] superview 4 :<_UIPopoverView: 0xdbfa4c0; frame = (-27 -57; 222 57); layer = <CALayer: 0xdbfa5a0>>

我们将不胜感激。

最佳答案

这是使用 map View 自己的委托(delegate)方法 calloutAccessoryControlTapped 而不是自定义方法的重要原因。

即使 superview 方法适用于 iOS 6 或更早版本,依赖特定 View 层次结构通常不是一个好主意。

委托(delegate)方法方便地提供了对注释 View 的引用,您可以通过 view.annotation 从中获取注释(无需猜测、希望或假设)。

删除 addTarget 并将自定义方法替换为委托(delegate)方法。

如果您必须使用自定义方法而不是委托(delegate)方法,则从 map View 的 selectedAnnotations 属性中获取所选注释比查找父 View 更可靠.

关于ios - iOS7中MKAnnotationView与其rightCalloutAccessoryView的布局关系发生了变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19081285/

相关文章:

android - 如何使用 fl_chart 显示工具提示指示器?

swift - 快速更改 UINavigationBar 中 UIBarButtonItem 的宽度

ios - 关于 mapView annotationView calloutAccessoryControlTapped 的问题

ios - Swift:如何从 TableView 中删除重复项?

iphone - 拥有MPMediaItem属性永久ID后,如何播放歌曲?

ios - React Native Swipeable(滑动删除)未关闭

ios - 如何将图像加载到 View ?

ios - 在 Storyboard 上处理阿拉伯语(从右到左)的最佳方式是什么?

ios - MKAnnotationView subview 上的 UITapGestureRecognizer 不起作用。 swift

ios - 获取mapView注解的indexPath