ios UIbutton不响应触摸事件

mtb9vblg  于 2023-06-07  发布在  iOS
关注(0)|答案(2)|浏览(176)

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

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

zdwk9cvp

zdwk9cvp1#

控件是否对事件作出React(例如触摸),取决于它是否是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

qojgxg4l

qojgxg4l2#

找到问题了。selectedRateView的高度约束为0,优先级为1000。这导致视图的高度为0,即使代码试图设置视图的框架。出于某种原因,子控件仍然可见;但不接收事件。
出于某种原因,这并没有在旧版本的iOS上强制执行。selectedRateView是在代码中设置框架时指定的高度,并且它的子帧正在接收触摸事件。

相关问题