UIButton无法响应触摸事件。

4

我的视图层次结构大致如下:

UIView -> UIStackView
             -> UIView
                -> PlayerView
             -> UIView
                -> UIStackView
                   UITextField (title)
                   UIButton (close)
                   UIButton (settings) etc...

我的问题是这样的...当屏幕加载时,如果我点击关闭或设置按钮,它是可以工作的。
问题在于,如果我首先点击Player View来播放视频,然后停止视频,并且当我点击任何UIButtons时,它不起作用。按钮是活动的,但触摸事件没有触发。 您可以在这里查看播放器实现: github playerview example 奇怪的是...如果我点击UITextField(Title),那么我就能够再次点击UIButtons,触摸事件也会触发。
我尝试将isUserInteractionEnabled = true添加到包含按钮的UIView中,但它没有起作用。
以下是UI调试树的屏幕截图: UI调试树的屏幕截图 以下是播放器视图对象检查器的屏幕截图: 播放器视图对象检查器的屏幕截图 以下是播放器视图层次结构的屏幕截图: 播放器视图层次结构的屏幕截图

检查是否有其他视图覆盖了按钮。另外,添加相关的代码。 - PGDev
@PGDev 没有其他的视图覆盖,它就无法工作。如果我不点击到其他视图(UIView->PlayerView),按钮就可以工作。RushabhCShah 我曾经在视图上设置了isUserInteractionEnabled = true,但是它没有起作用。 - learningswift
您需要在PlayerView的父级中启用UserInteraction方法。 - Rushabh Shah
这个按钮的高度和宽度是否合适? - Ankur Lahiry
对于按钮存在的每个超级视图(超级超级视图等),将“clipsToBounds”属性设置为true。你仍然可以看到这个按钮吗? - Jeshua Lacock
显示剩余6条评论
2个回答

2

一个控件是否对事件(例如触摸)做出反应,取决于它是否是第一响应者
如果事件是触摸,则发生触摸的UI元素将成为第一响应者。这适用于例如UIButton
由于只有当您没有播放视频时按钮才有效,这意味着它们启用了用户交互,并分配了目标操作。
当您播放并停止视频时,只有UITextField可以成为第一响应者,但没有按钮可以成为第一响应者,这对我来说意味着只有UITextField是可以点击的视图,而不是UIButtons。因此,UIButtons必须被某个其他视图覆盖,该视图不响应点击。
为了检查这一点,我建议您在断点处停止您的应用程序,并在Xcode调试区域中点击Debug View Hierarchy按钮:

enter image description here

然后,您应该查看您的按钮是否被其他东西覆盖。
编辑:
另一个想法:也许由于某种原因,您的按钮的属性 canBecomeFirstResponder 不是 true(请参见 here)。请在调试器中检查此内容。如果它为 false,则可以通过将其显式设置为 true 来获得成功。要这样做,您需要对按钮进行子类化,并覆盖此变量作为。
override var canBecomeFirstResponder: Bool {
  return true
}  

查看这里

谢谢你的回答,Reinhard。我已经添加了播放器视图层次结构,你可以查看上面的链接。不幸的是,我没有看到任何按钮重叠的情况。 - learningswift
我尝试设置canBecomeFirstResponder但没有成功。 - learningswift

0
发现问题了。selectedRateView 的高度约束为0,优先级为1000。即使代码试图设置它的框架,这导致视图的高度为0。由于某种原因,子控件仍然可见但无法接收事件。
由于某种原因,在旧版本的iOS上没有执行此操作。当在代码中设置框架并且其子元素正在接收触摸事件时,selectedRateView 的高度为指定值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接