【发布时间】:2013-03-14 21:08:52
【问题描述】:
非常好奇——XIB 中的标准圆角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 上的“开箱即用触摸”功能而侥幸。)
【问题讨论】:
-
您是否将 viewcontroller 添加为 childViewController?
-
视图控制器是一个UIWindow的rootViewController。
-
Hrm...我真的需要看看您是如何设置视图控制器的。您是从应用程序委托启动它吗?它可能什么都不是,但我猜这与您的视图/控制器层次结构有关。
-
这是一个模态视图,覆盖了“主”视图。当显示模态视图时,窗口和其他所有内容都是动态创建的。 (我现在手头没有代码,或者我会提供更多的播放。)