经过大量研究和试验,这似乎是尝试UIToolbar
与文本输入inputAccessoryView
一起使用的有效解决方案。(大多数现有的解决方案是使用固定的附件视图,而不是将其分配给文本视图(并在键盘关闭时隐藏它)。)
该代码的灵感来自https://stackoverflow.com/a/46510833/2603230。基本上,我们首先创建一个具有工具栏子视图的自定义视图:
class CustomInputAccessoryWithToolbarView: UIView {
public var toolbar: UIToolbar!
override init(frame: CGRect) {
super.init(frame: frame)
// https://stackoverflow.com/a/58524360/2603230
toolbar = UIToolbar(frame: frame)
// Below is adopted from https://stackoverflow.com/a/46510833/2603230
self.addSubview(toolbar)
self.autoresizingMask = .flexibleHeight
toolbar.translatesAutoresizingMaskIntoConstraints = false
toolbar.leadingAnchor.constraint(
equalTo: self.leadingAnchor,
constant: 0
).isActive = true
toolbar.trailingAnchor.constraint(
equalTo: self.trailingAnchor,
constant: 0
).isActive = true
toolbar.topAnchor.constraint(
equalTo: self.topAnchor,
constant: 0
).isActive = true
// This is the important part:
if #available(iOS 11.0, *) {
toolbar.bottomAnchor.constraint(
equalTo: self.safeAreaLayoutGuide.bottomAnchor,
constant: 0
).isActive = true
} else {
toolbar.bottomAnchor.constraint(
equalTo: self.layoutMarginsGuide.bottomAnchor,
constant: 0
).isActive = true
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// https://stackoverflow.com/a/46510833/2603230
// This is needed so that the inputAccesoryView is properly sized from the auto layout constraints.
// Actual value is not important.
override var intrinsicContentSize: CGSize {
return CGSize.zero
}
}
然后您可以将其设置为inputAccessoryView
正常的文本输入:(您应该指定框架大小以避免在UIToolbar 中看到带有 UIBarButtonItem LayoutConstraint 问题的警告)
let myAccessoryView = CustomInputAccessoryWithToolbarView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 44))
textView.inputAccessoryView = myAccessoryView
当你想与工具栏交互时(例如,设置工具栏上的项目),你可以简单地引用toolbar
变量:
myAccessoryView.toolbar.setItems(myToolbarItems, animated: true)
演示:(在模拟器中使用硬件键盘/Command+K)
前:

后:
