我有一个分配给我的视图控制器的inputAccessoryView
的视图。我调整了约束条件,使其位于iPhone X(X,XR,XS,XS Max)的原位指示器上方。通过在我的视图控制器中将inputAccessoryView
设置为canBecomeFirstResponder
,可以在隐藏键盘时将true
固定在屏幕底部。
它适用于X系列以外的所有手机。在所有X手机上,我的视图都没有任何触摸事件-它们正在击打其下方的视图,好像inputAccessoryView
不在那儿。
如果我将底部约束为superview而不是safeArea,那么它可以工作,但是它离home指示器太近了,我不希望这样做:
在此radar(“inputAccessoryViews应该尊重iPhone X上使用外部键盘的安全区域插入”)中,苹果工程师表示这不是错误,开发人员应将其中一种视图限制为其父级的safeAreaLayoutGuide
:
Engineering对此问题提供了以下反馈:您有责任尊重输入附件视图的safeAreaInsets。我们采用这种方式进行设计,以便开发人员可以提供背景视图(即,参见Safari的“在页面上查找”输入附件视图)并针对safeAreaInsets布置内容视图。这是相当容易实现的。有一个视图层次结构,其中有一个容器视图和一个内容视图。容器视图可以具有背景色或包含其整个边界的背景视图,并根据safeAreaInsets对其内容视图进行布局。如果您使用的是自动布局,这就像将内容视图的bottomAnchor设置为等于其 super 视图的safeAreaLayoutGuide一样简单。
我相信这正是我正在做的事情,但是由于X中断,我显然丢失了一些东西。
GitHub项目在这里:https://github.com/nambatee/HorizontallyScrollableToolbarAccessoryView/tree/master/Horizontally%20Scrollable%20Toolbar%20Accessory%20View
最佳答案
您的问题实际上是您没有为inputAccessoryView
设置高度,并且您的scrollView超出范围,这就是为什么您没有获得触摸事件,只是为了证明如果您进入顶层视图并将其设置为剪辑范围并运行您的项目,这就是您得到的
那么为什么会这样呢?这是因为您的视图没有intrinsicContentSize
,因此可以通过子类化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
关于ios - inputAccessoryView没有在iPhone X上获得触摸事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53364931/