2011-02-15 123 views
17

我有一个UILongPressGestureRecognizer添加到UIButton。当按下UIButton时,按预期突出显示。但是,当UILongPressGestureRecognizer选择器被调用时,突出显示被关闭。UILongPressGestureRecognizer关闭UIButton突出显示

UILongPressGestureRecognizer *longpressGesture = 
    [[UILongPressGestureRecognizer alloc] initWithTarget:self 
              action:@selector(longPressHandler:)]; 
    longpressGesture.minimumPressDuration = 5; 
    [longpressGesture setDelegate:self]; 
    [self.myUIButton addGestureRecognizer:longpressGesture]; 
    [longpressGesture release]; 

    - (void)longPressHandler:(UILongPressGestureRecognizer *)gestureRecognizer { 
    NSLog(@"longPressHandler"); 
} 

在上面的例子中,选择器在按住按钮5秒后被调用。该按钮在选择器被调用之前突出显示,但在选择器被调用时不会突出显示,即使我仍在按下按钮。

任何人都可以解释为什么发生这种情况,以及如何防止它?我希望按钮在按下时始终保持突出显示。谢谢。

回答

37

经过进一步研究,我发现这是由于默认行为的手势识别器,一旦他们识别出一个手势,它就会取消等级中的接触。所以,一旦手势识别器识别出一个手势,就会取消对UI按钮的触摸,然后该按钮被忽略,因为它不再有触摸事件。

此行为可以使用cancelsTouchesInView属性

longpressGesture.cancelsTouchesInView = NO; 

将此设置为NO将通过给应答链通过触摸而改变。

+0

但它会调用touchUpInside的选择器。如何防止? – user1010819 2013-11-21 19:35:21

0

这是有点猜测..:我怀疑GestureRecognizer的触发是在响应链中的按钮位置,这使得它失去焦点。我想不出什么办法来防止这种情况,但可能会有一些解决方法:

    在长按处理方法
  • 操纵按钮继续呈现按下状态。这可能是一个非常肮脏的方式来做到这一点。
  • 请勿使用手势识别器。相反,当按钮被按下时,立即创建一个定时器,5秒钟后调用某个选择器。如果在时间过去之前按钮被释放,则简单地使定时器无效。这应该是一个更“干净”的解决方案,但是,如果您决定使用手势识别器,这将无济于事。