从一个button的LongPress手势提供的iOS UIActionSheet错误地需要双击button来解除

我有一个tabbar应用程序,在我有一个MKMapView的选项卡之一。 在这个视图中,我的viewDidLoad我正在初始化一个UIButton的长按手势识别器。 当这个button被按下,并帮助它出现一个UIActionSheet 5button+取消button。 每个button代表缩放级别:“世界”,“国家”,“国家”,“城市”,“当前位置”。 在UIActionSheet中select一个button可以将底层MKMapView放大到这个级别。

我遇到的问题是所有button(包括取消button)都需要双击才能closuresUIActionSheet。 这不是预期的行为 – 按下button后,应该像其他UIActionSheet一样解散。 第一次按下后,我可以看到地图缩放到UIActionSheet后面的适当级别,所以我知道触摸正在注册在正确的button上,但button在第一次按下时不会高亮显示蓝色,并且UIActionSheet不会消除。 直到我再次按下button,它会突出显示蓝色,然后解散。

如果我删除了longpress手势识别器并将UIActionSheet显示在“内部修改”上,那么所有内容都按原样运行。 所以我知道这个手势是干扰的,任何想法的解决方法或解决方法? 或者这是一个应该向苹果报告的错误?

- (void) viewDidLoad { // intitialize longpress gesture UILongPressGestureRecognizer *longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(zoomOptions:)]; longPressRecognizer.minimumPressDuration = 0.5; longPressRecognizer.numberOfTouchesRequired = 1; [self.currentLocationButton addGestureRecognizer:longPressRecognizer]; } - (IBAction) zoomOptions:(UIGestureRecognizer *)sender { NSString *title = @"Zoom to:"; UIActionSheet *zoomOptionsSheet = [[UIActionSheet alloc] initWithTitle:title delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"World", @"Country", @"State", @"City", @"Current Location", nil]; [zoomOptionsSheet showFromTabBar:appDelegate.tabbarController.tabBar]; } 

安娜·卡列尼娜是对的,所提供的链接帮助我搞清楚了。 基本上, UILongPressGestureRecognizer是一个经历了各种状态变化的“连续手势”。 我需要检查适当的状态,在我的情况下是UIGestureRecognizerStateBegan因为我想UIActionSheet呈现后按下button,但在释放和停止手势之前。 我所要做的就是将UIActionSheet的performanceforms包含在if语句中,以检查相应的状态。 现在它按预期工作。

 - (IBAction) zoomOptions:(UILongPressGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateBegan) { NSString *title = @"Zoom to:"; UIActionSheet *zoomOptionsSheet = [[UIActionSheet alloc] initWithTitle:title delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"World", @"Country", @"State", @"City", @"Current Location", nil]; [zoomOptionsSheet showFromTabBar:appDelegate.tabbarController.tabBar]; } }