UILongPressGestureRecognizer关闭UIButton高亮显示

20

我在UIButton上添加了一个UILongPressGestureRecognizer。当我按下UIButton时,它会像预期的那样被高亮显示。然而,当UILongPressGestureRecognizer的选择器被调用时,高亮显示就被关闭了。

    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秒钟后被调用。在选择器被调用之前,按钮会被突出显示,但是当选择器被调用时,即使我仍然按住按钮,按钮也会取消突出显示。
有人可以解释为什么会发生这种情况以及如何防止它发生吗?我希望按钮在按下时始终保持突出显示。谢谢。
2个回答

40
进一步研究后,我发现这是手势识别器的默认行为造成的。一旦手势识别器识别了手势,在层次结构中取消触摸事件。因此,一旦手势识别器识别手势,它会取消对UI按钮的触摸,导致其不再高亮,因为它不再有触摸事件。
可以使用cancelsTouchesInView属性来更改此行为。
longpressGesture.cancelsTouchesInView = NO;

将此设置为“NO”将通过响应器链传递触摸。


1
但它将调用touchUpInside的选择器。如何防止这种情况发生? - user1010819
@user1010819,你找到这个问题的解决方案了吗?我也遇到了同样的问题。 - bezoadam

0

这有点推测性质...:我怀疑GestureRecognizer的触发正在取代响应者链中的按钮,这使它失去了焦点。我想不到任何方法来防止这种情况,但可能有一些解决方法:

  • 在长按处理程序方法中操作按钮以继续显示按下状态。这可能是一种非常粗暴的方法。
  • 不要使用手势识别器。相反,在按钮被按下后立即创建一个计时器,5秒后调用某个选择器。如果在时间到期之前释放按钮,则简单地使计时器无效。这应该是一种更“干净”的解决方案,但是,如果您决定使用手势识别器,这将无济于事。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接