2014-09-29 89 views
19

我不明白为什么点击我的视图中的文本字段和按钮不起作用。我已经检查了所有显而易见的事情,比如userInteractionEnabled是否设置为YES,是否安装了手势识别器,以及前景中是否存在不可见视图。如何调试谁在UIKit中进行我的触摸?

iOS中是否有一种最佳实践,用于追踪触摸从第一次出现到消耗的位置?

更新:

这两个答案都很有帮助。在我的调查过程中,我了解到,如果子视图超出其父界限,即使父项未裁剪子视图,子视图也不会收到事件。我从没有触及的文本字段打印出超级视图链,并且我看到其中一个视图的高度为0.我放置了一些限制来伸展它,并且我的问题得到解决。

+0

零尺寸视图位我。我做了一些中间的观点,以保持Z顺序理智,但我忘记更新中间视图的帧,所以他们留在零大小。一旦我在'LayoutSubviews'中更新它们,水龙头又开始流动了。 – 2016-07-19 19:58:04

+0

我也被这个咬了。总之,检查视图层次结构中存在这个问题的两件事情(假设它没有被非交互式透明视图覆盖):is userInteractionEnabled == true,并且如果height和width> 0。 – 2017-06-16 15:34:30

回答

13

您可以继承UIWindow并覆盖-[UIWindow sendEvent]:,然后在调用它时使用-[UIWindow hitTest:withEvent:]来测试哪个视图将接收事件。

然后,您可以拨打-[UIView recursiveDescription]来打印一些调试信息,以帮助您了解该视图接收触摸事件的原因。

当您完成时请记得致电[super sendEvent:]


对于那些谁使用故事板,想知道我们如何可以改变主应用程序窗口类:

class AppDelegate: UIResponder, UIApplicationDelegate { 
    var window: UIWindow? = TestWindow() 
    // .... 
} 

只是提供AppDelegatewindow VAR的默认值。当应用程序启动时,UIApplicationMain将实例化代理并请求它的window。如果windownil它将自动创建一个新的。但是如果我们在这里提供默认值,它将在整个应用程序中使用。

3

您可以使用新的Xcode6实时视图调试功能,通过在3D中转换视图层次结构,您可以查看哪些视图位于您关心的视图之上并检查它们。

1

不是直接回答这个问题,但消失触摸的一个常见原因是控件位于uiview中,该控件的尺寸小于该控件的尺寸,但不会限制其边界,因此您不会看到父视图更小(甚至可能是零大小)。

Parent UIView size=0x0, clipToBounds=false 

    Child UIButton size=100x50 

=>子按钮不会得到任何触摸事件。

相关问题