UIButton需要2秒钟来识别触摸

时间:2013-03-14 21:08:52

标签: ios5 uibutton

非常好奇 - XIB中的标准round-rec UIButton。 touchUpInside是否链接到视图控制器中的方法。在模拟器上它按预期工作,但在iOS 5 iPad上,必须按住按钮2秒才能调用链接方法(cancelButtonPressed :)。

提取和记录按钮的目标操作表明它确实在寻找正确的目标对象和方法的touchUpInside事件。

为新目标方法添加(在viewDidAppear中)操作会产生相同的行为 - 仅当按下按钮2秒(然后释放)时才会调用新方法。它在原始方法之后立即被调用。

警告:这个设置当然是一个发型。这是在主屏幕上浮动的模态视图。为了到达这里,在VC的视图加载之后,VC和它的原始视图之间插入了一个视图。

但当然它在模拟器上运行得很好。 (也可能在iOS6硬件上,虽然我还没试过。)

所以任何想法是什么可以创造需要按住按钮2秒?触摸后立即“动画”(变成颜色)按钮,所以不是简单地长时间触摸传播。

更多信息:运营顺序

  • 创建一个相对正常的视图控制器
  • 创建一个新的UIView,让视图控制器查看这个新视图,将VC的原始视图作为子视图添加到这个新视图中
  • 为两个视图添加触摸手势识别器,以便可以识别VC原始视图外部的触摸。 (一个被添加到VC的原始视图中,以便可以忽略那里的触摸。)
  • 创建UIWindow,设置为“普通窗口”
  • 将新窗口的根视图控制器设置为上述视图控制器
  • makeKeyAndVisible在新窗口中。

(这(几乎)成功创建了一个带有所选VC的“弹出窗口”。)

观察:

  • 按钮立即响应触摸(通过改变颜色),因此触摸信息过滤到视图没有延迟。
  • 按钮触摸仅在按住按钮约2秒后才有效,因此触摸事件不会被延迟交付。
  • 因此,必须影响特定于按钮的逻辑,以决定是否发生了触摸。

啊哈!

在写这篇文章时,我发现手势识别器可能会以某种方式参与其中。禁用他们,不再是问题。这些是UITapGestureRecognizers,不应该(人们会想到)影响按钮响应(因为在其他地方提倡相同的方案来检测“框外”的触摸)。 (立即调用手势识别器处理程序。)

(并不是说这个知识对我有好处,除了我可以在iOS 5上禁用“开箱即用”功能。)

1 个答案:

答案 0 :(得分:2)

在iOS5中这样做是为了避免它:

- (void)tappedAction:(UIGestureRecognizer *)sender  {
    float version = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (version < 6.0) {
        CGPoint pt = [sender locationInView:_button];
        NSLog(@"%@", NSStringFromCGPoint(pt));
        if (CGRectContainsPoint( _button.bounds, pt)) {
            [self buttonAction:_button];
            return;
        }
    }          
    // do some Tapped Action
    NSLog(@"tappedAction:");
}