我的视图层次结构是这样的:
UIView -> UIStackView
-> UIView
-> PlayerView
-> UIView
-> UIStackView
UITextField (title)
UIButton (close)
UIButton (settings) etc...
我的问题如下...加载屏幕时,如果我单击关闭或设置按钮,它会起作用。
问题是,如果我先单击“播放器视图”以播放视频,然后停止视频,那么当我点击任意一个UIButton时,它将无法正常工作。按钮处于活动状态,但不会触发触摸事件。 您可以在此处查看播放器的实现: github playerview example
奇怪的是...如果我单击UITextField(标题),则可以再次单击UIButton,并且触发触摸事件。
我曾在将isUserInteractionEnabled = true
添加到有按钮的UIView上玩过,但这没用。
答案 0 :(得分:0)
控件是否对事件做出反应(例如触摸),取决于控件是否为first responder。
如果事件是触摸,则发生触摸的UI元素将成为第一响应者。这适用于到UIButton
。
由于只要您不播放视频,按钮便会起作用,因此这意味着它们已启用用户交互,并且已分配了目标操作。
当您播放和停止视频时,只有UITextField
但没有按钮可以成为第一响应者,这对我来说意味着只有UITextField
是可以点击的视图,而{{1 }}。因此,UIButtons
必须被其他无法响应点击的视图覆盖。
要对此进行检查,建议您在断点处停止应用程序,然后在Xcode调试区域中点击Debug View Hierarchy按钮:
然后,您应该查看按钮是否被其他东西覆盖。
编辑:
另一个想法:也许由于某种原因,按钮的属性UIButtons
不是canBecomeFirstResponder
(请参见here)。请在调试器中检查。如果为true
,则可以通过将其显式设置为false
来获得成功。为此,您必须对按钮进行子类化,并将此true
替换为
var
请参见here。
答案 1 :(得分:0)
发现问题。 selectedRateView 的高度约束为 0,优先级为 1000。这导致视图的高度为 0,即使代码试图设置它的框架。出于某种原因,子控件仍然可见;但不接收事件。
出于某种原因,旧版本的 iOS 没有强制执行此操作。 selectedRateView 是在代码中设置框架时指定的高度,它的孩子正在接收触摸事件。