inputAccessoryView 没有在 iPhone X 上获得触摸事件

Posted

技术标签:

【中文标题】inputAccessoryView 没有在 iPhone X 上获得触摸事件【英文标题】:inputAccessoryView not getting touch events on iPhone X 【发布时间】:2018-11-18 20:05:15 【问题描述】:

我有一个视图,我指定为我的视图控制器的inputAccessoryView。我调整了约束,使其位于 iPhone X(X、XR、XS、XS Max)上的 home 指示器上方。通过在我的视图控制器中将canBecomeFirstResponder 设置为true,当键盘被隐藏时,我将inputAccessoryView 固定在屏幕底部。

它适用于除 X 系列以外的所有手机。在所有 X 手机上,我的视图都没有收到任何触摸事件 - 它们正在点击它下方的视图,好像 inputAccessoryView 不存在一样。

如果我将底部限制为 superview 而不是 safeArea,它可以工作,但是它太靠近 home 指示器,这是我不想要的:

在这个radar(“inputAccessoryViews 应该尊重 iPhone X 上的外部键盘插入的安全区域”)中,Apple 工程师说这不是一个错误,开发人员应该将其中一个视图限制为其父级的 safeAreaLayoutGuide

Engineering 针对此问题提供了以下反馈:您有责任尊重输入附件视图的 safeAreaInsets。我们以这种方式设计它,以便开发人员可以提供背景视图(即,参见 Safari 的 Find on Page 输入附件视图)并根据 safeAreaInsets 布置内容视图。这很容易实现。有一个视图层次结构,其中有一个容器视图和一个内容视图。容器视图可以具有背景颜色或包含其整个边界的背景视图,并且它基于 safeAreaInsets 布置其内容视图。如果您使用的是自动布局,这很简单,只需将内容视图的 bottomAnchor 设置为与其父视图的 safeAreaLayoutGuide 相等即可。

我相信这正是我正在做的,但我显然错过了一些东西,因为它在 X 上中断了。

GitHub 项目在这里:https://github.com/nambatee/HorizontallyScrollableToolbarAccessoryView/tree/master/Horizontally%20Scrollable%20Toolbar%20Accessory%20View

【问题讨论】:

【参考方案1】:

您的问题实际上是您没有为inputAccessoryView 设置高度,并且您的滚动视图超出了界限,这就是您没有收到触摸事件的原因,只是为了证明如果您转到***视图并设置它剪辑到边界并运行你的项目这就是你得到的

那么为什么会这样呢?这是因为您的视图没有intrinsicContentSize,您可以通过子类化UIView 并覆盖intrinsicContentSize 并返回您想要的任何宽度和高度,就像这样

class CustomView: UIView 
    override var intrinsicContentSize: CGSize 
        return CGSize.zero
    

不要忘记在代码和 nib 文件中将视图设置为 CustomView

private lazy var horizontallyScrollableToolbarAccessoryView: CustomView? = 
        let nibName = "HorizontallyScrollableToolbarAccessoryView"
        let view = Bundle.main.loadNibNamed(nibName, owner: nil, options: nil)?.first as? CustomView
        return view
()

你也可以通过像这样的高度约束来提供高度

override func viewDidLoad() 
        super.viewDidLoad()
        self.horizontallyScrollableToolbarAccessoryView?.heightAnchor.constraint(equalToConstant: 80).isActive = true

但您仍需要将 intrinsicContentSize 设置为 CGSize.Zero

class CustomView: UIView 
    override var intrinsicContentSize: CGSize 
        return CGSize.zero
    

这就是你最后得到的工作scrollView

【讨论】:

我想知道我自己要花多少时间来解决这个问题。谢谢!

以上是关于inputAccessoryView 没有在 iPhone X 上获得触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

inputAccessoryView 没有在 iPhone X 上获得触摸事件

反应本机 InputAccessoryView 在 iOS 11 上不起作用

如何在 inputAccessoryView 内的 UILabel 中使用 AutoScrollLabel?

inputAccessoryView 出现键盘时不调用

InputAccessoryView 使用键盘交互显示/隐藏上下移动表格视图

InputAccessoryView 边框?