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

Swift:全设备适配UITextView高度,使其贴合键盘顶部UIToolBar

实现UITextView与键盘顶部ToolBar的适配方案

我来给你梳理两种靠谱的实现方案,保证在所有设备上都能完美适配你的需求:

方法一:Auto Layout + 代码动态调整(推荐跨设备适配)

这是最稳妥的方案,能自动适配不同设备的键盘高度变化:

  1. Storyboard里先搭好基础约束
    选中你的UITextView,给它添上这些约束:

    • 顶部对齐父视图(或者你需要的顶部起始位置)
    • 左侧、右侧都和父视图边缘对齐
    • 最后加一个底部约束,暂时让它贴紧父视图底部,关键是要给这个底部约束创建一个IBOutlet(比如命名为textViewBottomConstraint),后面要通过代码改它的值。
  2. 注册键盘弹出/收起的通知
    在ViewController的viewDidLoad里加上这段代码,监听键盘的状态变化:

    override func viewDidLoad() {
        super.viewDidLoad()
        // 监听键盘弹出和收起事件
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
    }
    

    要是你用Objective-C的话,语法稍微调整一下就行,核心逻辑是一样的。

  3. 写键盘事件的处理逻辑
    当键盘弹出时,我们要拿到键盘的总高度(包括你那44高的ToolBar),然后调整UITextView的底部约束,让它的底部刚好停在ToolBar上方:

    @objc func keyboardWillShow(_ notification: Notification) {
        guard let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return }
        // 拿到键盘+ToolBar的总高度
        let totalKeyboardHeight = keyboardFrame.height
        // 修改底部约束的偏移量,让UITextView往上缩到ToolBar下方
        textViewBottomConstraint.constant = totalKeyboardHeight
        // 用动画让布局变化更顺滑
        UIView.animate(withDuration: 0.3) {
            self.view.layoutIfNeeded()
        }
        // 可选:让光标自动滚动到可见区域,避免被挡住
        self.textView.scrollRangeToVisible(self.textView.selectedRange)
    }
    
    @objc func keyboardWillHide(_ notification: Notification) {
        // 键盘收起时,把底部约束恢复原样
        textViewBottomConstraint.constant = 0
        UIView.animate(withDuration: 0.3) {
            self.view.layoutIfNeeded()
        }
    }
    
  4. 记得清理通知(避免内存泄漏)
    在ViewController销毁时移除监听:

    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    

方法二:纯Storyboard固定约束(仅适合特定设备)

如果你的APP只针对某一类设备(比如都是全面屏或者都是非全面屏),也可以直接算好键盘+ToolBar的总高度,给UITextView的底部约束设置对应的constant值。但这种方式在不同设备上容易出适配问题,所以不太推荐跨设备使用。

额外提醒

  • 要确保你的UIToolBar已经设置成了UITextView的inputAccessoryView,不然ToolBar不会显示在键盘顶部:
    textView.inputAccessoryView = yourToolBar
    

内容的提问来源于stack exchange,提问作者Miloo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:33:56