您可能还需要解决 inputAccessoryView 不尊重安全区域边距的错误,因此没有为 iPhone X 上的主页指示器腾出空间:iPhone X 如何处理视图控制器 inputAccessoryView?
当您有来自 xib 的 UIToolbar 并且您还使用该 UIToolbar 作为文本字段的 inputAccessoryView 时,我找到了最简单的解决方案,即当您从覆盖的 inputAccessoryView 返回工具栏时,将工具栏嵌入 UIView 中,并使包含的 UIView 更高通过 safeAreaInsets.bottom。(其他解决方案建议将工具栏的底部约束到子类中的安全区域,但这会导致约束冲突,也意味着工具栏下的区域颜色错误。)但是,您还必须记住,文本即使屏幕上没有键盘(例如,如果有外部键盘),字段也可以具有焦点,因此在这种情况下,您也需要将文本视图的 inputAccessoryView 更改为此工具栏-in-a-UIView。事实上,总是使用包含视图并适当地调整它的大小可能会使事情变得更简单。无论如何,这是我对 inputAccessoryView 的覆盖:
override var inputAccessoryView: UIView? {
if toolbarContainerView == nil {
let frame=CGRect(x: toolBar.frame.minX, y: toolBar.frame.minY, width: toolbar.frame.width, height: toolBar.frame.height+view.safeAreaInsets.bottom)
toolbarContainerView = UIView(frame: frame)
}
if (toolbar.superview != toolbarContainerView) {
//this is set to false when the toolbar is used above the keyboard without the container view
//we need to set it to true again or else the toolbar will appear at the very top of the window instead of the bottom if the keyboard has previously been shown.
toolbar.translatesAutoresizingMaskIntoConstraints=true
toolbarContainerView?.addSubview(toolbar)
}
return toolbarContainerView
}
It would probably be a good idea to override viewSafeAreaInsetsDidChange to adjust the size of toolbarContainerView in that case, too.