You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:39:24