我的视图层次结构是这样的:
UIView -> UIStackView
-> UIView
-> PlayerView
-> UIView
-> UIStackView
UITextField (title)
UIButton (close)
UIButton (settings) etc...
我的问题是以下...当屏幕加载时,如果我点击关闭或设置按钮,它就能工作。
问题是,如果我先点击播放器视图来播放视频,然后我停止视频,当我点击任何UI按钮时,它都不起作用。按钮处于活动状态,但未触发触摸事件。你可以在这里看到播放器的实现:github playerview example
奇怪的是...如果我点击UITextField(Title),那么我就可以再次点击UIButtons,并且触发触摸事件。
我曾经尝试将isUserInteractionEnabled = true
添加到UIView中,在那里我有按钮,但它不起作用。
here is a screenshot of UI debug tree
Player view object inspector
Player view hierarchy
2条答案
按热度按时间zdwk9cvp1#
控件是否对事件作出React(例如触摸),取决于它是否是first responder。
如果事件是触摸,则发生触摸的UI元素成为第一响应者。这适用于例如一个
UIButton
由于只要您没有播放视频,按钮就可以工作,这意味着它们启用了用户交互,并且指定了目标操作。
当您播放和停止视频时,只有
UITextField
但没有按钮可以成为第一响应者,这对我来说意味着只有UITextField
是可以点击的视图,而不是UIButtons
。所以UIButtons
必须被其他一些不响应点击的视图覆盖。要检查这一点,我建议你在断点处停止你的应用,然后在Xcode调试区域点击Debug View Hierarchy按钮:
然后,你应该看看你的按钮是否被其他东西覆盖。
编辑:
还有一个主意也许由于某种原因,按钮的属性
canBecomeFirstResponder
不是true
(请参见here)。请在调试器中检查这个。如果它是false
,您可以通过显式地将其设置为true
来成功。为此,您必须将按钮子类化,并将此var
重写为参见here。
qojgxg4l2#
找到问题了。selectedRateView的高度约束为0,优先级为1000。这导致视图的高度为0,即使代码试图设置视图的框架。出于某种原因,子控件仍然可见;但不接收事件。
出于某种原因,这并没有在旧版本的iOS上强制执行。selectedRateView是在代码中设置框架时指定的高度,并且它的子帧正在接收触摸事件。