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

时间:2018-11-18 20:05:15

标签: ios autolayout iphone-x safearealayoutguide inputaccessoryview

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

它适用于X系列以外的所有手机。在所有X手机上,我的视图都没有任何触摸事件-它们击中了它下面的视图,好像没有inputAccessoryView一样。

Tapping any of the buttons inside inputAccessoryView won't work

如果我将底部约束为superview而不是safeArea,那么它可以工作,但是它离home指示器太近了,我不希望这样:

inputAccessoryView is too close to the home indicator

在此radar中(“ inputAccessoryViews应该尊重使用iPhone X上的外部键盘插入的安全区域”),苹果工程师说这不是错误,开发人员应将其中一种视图限制为其父级的{{ 1}}:

  

Engineering已针对此问题提供了以下反馈:尊重输入附件视图的safeAreaInsets是您的责任。我们采用这种方式进行设计,以便开发人员可以提供背景视图(即,参见Safari的“在页面上查找”输入附件视图)并针对safeAreaInsets布置内容视图。这是相当容易实现的。有一个视图层次结构,其中有一个容器视图和一个内容视图。容器视图可以具有背景色或包含其整个边界的背景视图,并根据safeAreaInsets对其内容视图进行布局。如果您使用的是自动布局,则只需将内容视图的bottomAnchor设置为等于其超级视图的safeAreaLayoutGuide。

我相信这正是我正在做的事情,但是由于X中断,我显然丢失了一些东西。

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

1 个答案:

答案 0 :(得分:0)

您的问题实际上是您没有为inputAccessoryView设置高度,并且您的scrollView超出范围,这就是为什么您没有获得触摸事件并只是证明如果您进入顶层视图的原因并将其设置为限幅剪辑并运行您的项目,这就是您得到的 sample

那为什么会这样呢?这是因为您的视图没有intrinsicContentSize,因此可以通过将intrinsicContentSize子类化并覆盖UIView并为其返回intrinsicContentSize来返回所需的宽度和高度,就像这样< / p>

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

sample 2

相关问题