0

非常好奇——XIB 中的标准圆角录制 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 上的“开箱即用”功能而侥幸逃脱。)

4

1 回答 1

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:");
}
于 2013-05-15T08:28:41.560 回答