UIbutton 不响应触摸事件
Posted
技术标签:
【中文标题】UIbutton 不响应触摸事件【英文标题】:UIbutton doesn't respond to touch events 【发布时间】:2019-06-28 09:06:03 【问题描述】:我的视图层次结构是这样的:
UIView -> UIStackView
-> UIView
-> PlayerView
-> UIView
-> UIStackView
UITextField (title)
UIButton (close)
UIButton (settings) etc...
我的问题是...当屏幕加载时,如果我点击关闭或设置按钮,它会起作用。
问题是,如果我先单击播放器视图播放视频,然后我停止视频,当我点击任何 UIButtons 时,它都不起作用。按钮处于活动状态,但触摸事件不会触发。 您可以在此处查看播放器实现: github playerview example
奇怪的是……如果我点击 UITextField(标题)然后我可以再次点击 UIButtons,并且触摸事件正在触发。
我曾尝试将isUserInteractionEnabled = true
添加到我有按钮的 UIView 中,但它不起作用。
here is a screenshot of UI debug tree
Player view object inspector
Player view hierarchy
【问题讨论】:
检查是否有其他视图覆盖按钮。另外,添加相关代码。 @PGDev 没有其他视图覆盖,它根本不起作用。如果我不单击其他视图(UIView -> PlayerView),按钮会起作用 RushabhCShah 我在视图上设置 isUserInteractionEnabled = true,但它不起作用。 您需要在PlayerView的父级中启用UserInteraction方法。 请在调试器模式下分享您的 UI,并可能分享一些代码以便更好地理解。 @EmreCiftci 将图像添加到 ui 调试器模式...我认为问题出在播放器视图中,因为它是 UIWebView。单击播放器后,我无法单击下面 UIView 上的以下按钮。 【参考方案1】:控件是否对事件(例如触摸)做出反应,取决于它是否是first responder。
如果事件是触摸,则发生触摸的 UI 元素将成为第一个响应者。这适用于例如到UIButton
。
由于只要您不播放视频,您的按钮就会起作用,这意味着它们已启用用户交互,并且已分配目标操作。
当您播放和停止视频时,只有UITextField
但没有按钮可以成为第一响应者,这对我来说意味着只有UITextField
是可以点击的视图,而不是UIButtons
。所以UIButtons
必须被其他不响应点击的视图覆盖。
要检查这一点,我建议您在断点处停止您的应用程序,然后在 Xcode 调试区域中点击 Debug View Hierarchy 按钮:
然后,你应该看看你的按钮是否被其他东西覆盖了。
编辑:
还有一个想法:可能由于某种原因,您的按钮的属性canBecomeFirstResponder
不是true
(请参阅here)。请在调试器中检查。如果它是false
,您可以通过将其显式设置为true
来获得成功。为此,您必须对按钮进行子类化,并将此 var
覆盖为
override var canBecomeFirstResponder: Bool
return true
见here。
【讨论】:
感谢您的回答,莱因哈德。我在上面添加了播放器视图层次结构,您可以查看最后一个链接。不幸的是,我没有看到按钮上有任何重叠。 我尝试设置canBecomeFirstResponder
,但没有成功。【参考方案2】:
发现问题。 selectedRateView 的高度约束为 0,优先级为 1000。即使代码试图设置它的框架,这也会导致视图的高度为 0。由于某种原因,子控件仍然可见;但不接收事件。
出于某种原因,旧版本的 ios 并未强制执行此操作。 selectedRateView 是在代码中设置框架时指定的高度,它的子级正在接收触摸事件。
【讨论】:
以上是关于UIbutton 不响应触摸事件的主要内容,如果未能解决你的问题,请参考以下文章
UIButton ImageView 在 iCarousel 中占用更多空间并且不响应触摸事件
如果 UIButton 的位置超出其父视图但它是可见的,它可以响应触摸事件吗?
尽管 userInteractionEnabled = true,但 UIView 中的 UIButton 没有响应触摸事件