如何修改iOS SwiftUI构建的键盘扩展(Keyboard Extension)高度
SwiftUI 自定义键盘扩展高度修改方案
自定义键盘的默认高度由系统自动生成,要修改高度核心是给UIInputViewController的根视图(即键盘的inputView)添加高优先级的高度约束,约束直接写在KeyboardViewController的viewDidLoad方法中即可。
可直接复用的修改后代码
import UIKit import SwiftUI class KeyboardViewController: UIInputViewController { // 按需修改为你需要的键盘高度 private let customKeyboardHeight: CGFloat = 320 // 存约束引用方便后续动态改高度 private var heightConstraint: NSLayoutConstraint? override func viewDidLoad() { super.viewDidLoad() let keyboardController = UIHostingController(rootView: KeyboardWrapper()) // 走标准UIKit子控制器嵌入流程 addChild(keyboardController) keyboardController.view.translatesAutoresizingMaskIntoConstraints = false view.addSubview(keyboardController.view) keyboardController.didMove(toParent: self) // 将SwiftUI根视图约束铺满整个键盘区域 NSLayoutConstraint.activate([ keyboardController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), keyboardController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), keyboardController.view.topAnchor.constraint(equalTo: view.topAnchor), keyboardController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) // 核心:添加高度约束,覆盖系统默认高度 let constraint = NSLayoutConstraint( item: view!, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: customKeyboardHeight ) constraint.priority = .required view.addConstraint(constraint) heightConstraint = constraint } // 动态修改高度的方法,切换面板、展开候选栏时调用即可 func updateKeyboardHeight(_ newHeight: CGFloat) { heightConstraint?.constant = newHeight view.layoutIfNeeded() } } struct KeyboardWrapper: View { var body: some View { GeometryReader { rect in // 原有Keyboard视图无需任何修改,会自动适配新高度 Keyboard(rect: rect) } } }
关键注意点
- 高度约束必须加在
KeyboardViewController自带的根view上,不要加在UIHostingController的view上,否则会被系统强制重置为默认键盘高度 - 弃用原来的
autoresizingMask自适应写法,必须把translatesAutoresizingMaskIntoConstraints设为false,否则会和手动添加的约束冲突导致布局错乱 - 嵌入
UIHostingController必须走完整的addChild->addSubview->didMove(toParent:)流程,否则会出现SwiftUI视图生命周期异常、布局偏移的问题 - 高度约束的优先级要设为
.required,否则会被系统内置的默认高度约束覆盖,设置不生效 - 如果需要做横竖屏适配、动态切换面板高度,只要调用
updateKeyboardHeight方法修改约束值即可,不需要重复创建约束
修改完成后,KeyboardWrapper里的GeometryReader会自动读取到新的键盘尺寸,内部的业务视图不需要做额外适配。
内容的提问来源于stack exchange,提问作者Enrico Borba
相关产品推荐
相关产品推荐

