繁体   English   中英

UIbutton 不响应触摸事件

[英]UIbutton doesn't respond to touch events

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

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

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

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

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

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

这是 UI 调试树的屏幕截图

玩家视图对象检查器

玩家视图层次结构

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

在此处输入图片说明

然后,您应该查看按钮是否被其他东西覆盖。

编辑:

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

override var canBecomeFirstResponder: Bool {
  return true
}  

这里

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM