UIbutton不响应触摸事件

时间:2019-06-28 09:06:03

标签: ios uibutton

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

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

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

问题是,如果我先单击“播放器视图”以播放视频,然后停止视频,那么当我点击任意一个UIButton时,它将无法正常工作。按钮处于活动状态,但不会触发触摸事件。 您可以在此处查看播放器的实现: github playerview example

奇怪的是...如果我单击UITextField(标题),则可以再次单击UIButton,并且触发触摸事件。

我曾在将isUserInteractionEnabled = true添加到有按钮的UIView上玩过,但这没用。

here is a screenshot of UI debug tree

Player view object inspector

Player view hierarchy

2 个答案:

答案 0 :(得分:0)

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

enter image description here

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

编辑:

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

var

请参见here

答案 1 :(得分:0)

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

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