4

我正在尝试将我的一个应用程序更新到 iOS7。问题是,在我的 上MKMapView,当我点击一个图钉时,它会显示Callout,但是当单击 时rightCalloutAccessoryView,它不再向委托发送任何回调。因此我不能再推送详细视图了。

它在 iOS6 上运行良好,在 iOS7 上就不行了。

这是相关的代码:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        return nil;
    }
    NSString * annotationIdentifier = nil;
    if ([annotation isKindOfClass:VPStation.class]) {
        annotationIdentifier = @"stationAnnotationIdentifier";
    }
    if (!annotation) {
        return nil;
    }
    MKPinAnnotationView * annotationView = [(MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier] retain];
    if(annotationView == nil) {
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];
        annotationView.canShowCallout = YES;
        annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        annotationView.image = [UIImage imageNamed:@"MyAnnotationPin"];
        annotationView.centerOffset = CGPointMake(-10.0f, 0.0f);
    }
    annotationView.annotation = annotation;

    return [annotationView autorelease];
}

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
    if ([view.annotation isKindOfClass:VPStation.class]) {
        VPTotalDetailViewController * detailVC = [[VPTotalDetailViewController alloc] initWithStation:(VPStation *)view.annotation
                                                                                      andUserLocation:self.mapView.userLocation.coordinate];
        [self.navigationController pushViewController:detailVC animated:YES];
        [detailVC release];
    }
}

根据MKAnnotationView类参考:

如果您指定的视图也是 UIControl 类的后代,您可以使用地图视图的委托在您的控件被点击时接收通知。如果它不是从 UIControl 派生的,则您的视图负责处理其范围内的任何触摸事件。

有什么比放置我自己的UIView子类来获得触摸并推送 detailViewController 更简单的事情吗?我应该等待Apple修复这个错误吗?我相信这是一个错误,不是吗?

提前致谢

4

1 回答 1

12

好吧,这里的问题是我有一个UIGestureRecognizer设置MKMapView(对于它的价值,它是一个自定义识别器,但我不相信这会改变任何东西)并且这个手势识别器消耗了触摸,然后不会转发到calloutAccessoryControl. 请注意,此行为在 iOS6 和 iOS7 之间发生了变化。不过修复很简单,我将控制器添加为识别器的代表(以前不是)并实现了该UIGestureRecognizerDelegate方法:

#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isKindOfClass:[UIControl class]]) {
        return NO;
    }
    return YES;
}
于 2013-09-18T08:49:10.977 回答