iOS 11中键盘与inputAccessoryView间存在额外间距的UI问题排查
解决inputAccessoryView与键盘之间的额外间距问题
这个问题我之前在项目里也踩过坑!首次进入页面点击文本框时,inputAccessoryView和键盘之间多出一块莫名的间距,核心原因大多是视图布局时机不对——在viewDidLoad阶段,页面的布局还没完全确定,这时候给文本框设置inputAccessoryView,toolbar的尺寸计算会出现偏差,导致和键盘衔接不上。
下面给你两个亲测有效的解决方案:
方案一:在视图布局完成后设置inputAccessoryView
把设置代码移到viewDidLayoutSubviews里,这里是视图布局最终确定的时机,同时要加个判断避免重复设置:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // 确保只初始化一次inputAccessoryView guard myTextfield.inputAccessoryView == nil else { return } let keyboardToolbar = UIToolbar() keyboardToolbar.items = [ UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), UIBarButtonItem(title: "Hide", style: .done, target: self, action: #selector(resignFirstResponder)) ] keyboardToolbar.barStyle = barStyle keyboardToolbar.sizeToFit() // 关键:关闭自动约束,让系统正确处理toolbar与键盘的适配 keyboardToolbar.translatesAutoresizingMaskIntoConstraints = false myTextfield.inputAccessoryView = keyboardToolbar }
方案二:用懒加载创建toolbar,延迟到视图显示后赋值
懒加载的toolbar会在第一次使用时才初始化,配合viewDidAppear的时机,能保证布局完全稳定:
// 懒加载创建toolbar lazy var keyboardToolbar: UIToolbar = { let toolbar = UIToolbar() toolbar.items = [ UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), UIBarButtonItem(title: "Hide", style: .done, target: self, action: #selector(resignFirstResponder)) ] toolbar.barStyle = barStyle toolbar.sizeToFit() toolbar.translatesAutoresizingMaskIntoConstraints = false return toolbar }() override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 此时视图布局已稳定,赋值inputAccessoryView myTextfield.inputAccessoryView = keyboardToolbar }
额外排查点
如果上面的方案没解决,你可以检查下:
- 导航栏的半透明设置:
navigationController?.navigationBar.isTranslucent = false(半透明可能影响键盘和toolbar的布局计算) - 文本框的
inputAccessoryView是否被其他代码重复赋值
内容的提问来源于stack exchange,提问作者Mikhail Serov
相关产品推荐
相关产品推荐

