![](/img/trans.png)
[英]UITableView in a subview doesn't respond to touch events and doesn't scroll
[英]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元素将成为第一响应者。 例如,这适用于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.