UIbutton 不响应触摸事件

Posted

技术标签:

【中文标题】UIbutton 不响应触摸事件【英文标题】:UIbutton doesn't respond to touch events 【发布时间】:2019-06-28 09:06:03 【问题描述】:

我的视图层次结构是这样的:

UIView -> UIStackView
             -> UIView
                -> PlayerView
             -> UIView
                -> UIStackView
                   UITextField (title)
                   UIButton (close)
                   UIButton (settings) etc...

我的问题是...当屏幕加载时,如果我点击关闭或设置按钮,它会起作用。

问题是,如果我先单击播放器视图播放视频,然后我停止视频,当我点击任何 UIButtons 时,它都不起作用。按钮处于活动状态,但触摸事件不会触发。 您可以在此处查看播放器实现: github playerview example

奇怪的是……如果我点击 UITextField(标题)然后我可以再次点击 UIButtons,并且触摸事件正在触发。

我曾尝试将isUserInteractionEnabled = true 添加到我有按钮的 UIView 中,但它不起作用。

here is a screenshot of UI debug tree

Player view object inspector

Player view hierarchy

【问题讨论】:

检查是否有其他视图覆盖按钮。另外,添加相关代码。 @PGDev 没有其他视图覆盖,它根本不起作用。如果我不单击其他视图(UIView -> PlayerView),按钮会起作用 RushabhCShah 我在视图上设置 isUserInteractionEnabled = true,但它不起作用。 您需要在PlayerView的父级中启用UserInteraction方法。 请在调试器模式下分享您的 UI,并可能分享一些代码以便更好地理解。 @EmreCiftci 将图像添加到 ui 调试器模式...我认为问题出在播放器视图中,因为它是 UIWebView。单击播放器后,我无法单击下面 UIView 上的以下按钮。 【参考方案1】:

控件是否对事件(例如触摸)做出反应,取决于它是否是first responder。 如果事件是触摸,则发生触摸的 UI 元素将成为第一个响应者。这适用于例如到UIButton。 由于只要您不播放视频,您的按钮就会起作用,这意味着它们已启用用户交互,并且已分配目标操作。 当您播放和停止视频时,只有UITextField 但没有按钮可以成为第一响应者,这对我来说意味着只有UITextField 是可以点击的视图,而不是UIButtons。所以UIButtons 必须被其他不响应点击的视图覆盖。 要检查这一点,我建议您在断点处停止您的应用程序,然后在 Xcode 调试区域中点击 Debug View Hierarchy 按钮:

然后,你应该看看你的按钮是否被其他东西覆盖了。

编辑:

还有一个想法:可能由于某种原因,您的按钮的属性canBecomeFirstResponder 不是true(请参阅here)。请在调试器中检查。如果它是false,您可以通过将其显式设置为true 来获得成功。为此,您必须对按钮进行子类化,并将此 var 覆盖为

override var canBecomeFirstResponder: Bool 
  return true
  

见here。

【讨论】:

感谢您的回答,莱因哈德。我在上面添加了播放器视图层次结构,您可以查看最后一个链接。不幸的是,我没有看到按钮上有任何重叠。 我尝试设置canBecomeFirstResponder,但没有成功。【参考方案2】:

发现问题。 selectedRateView 的高度约束为 0,优先级为 1000。即使代码试图设置它的框架,这也会导致视图的高度为 0。由于某种原因,子控件仍然可见;但不接收事件。

出于某种原因,旧版本的 ios 并未强制执行此操作。 selectedRateView 是在代码中设置框架时指定的高度,它的子级正在接收触摸事件。

【讨论】:

以上是关于UIbutton 不响应触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

UIButton ImageView 在 iCarousel 中占用更多空间并且不响应触摸事件

UIButton 触摸事件落入底层视图

如果 UIButton 的位置超出其父视图但它是可见的,它可以响应触摸事件吗?

尽管 userInteractionEnabled = true,但 UIView 中的 UIButton 没有响应触摸事件

图像视图没有响应触摸事件

如何通过 -addSublayer 添加 UI 元素:响应触摸事件?