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

Xcode14+iOS16环境下聊天App表情视图无法显示在键盘上方的解决办法

问题解决:iOS16/Xcode14下表情视图无法显示在键盘上方

失效原因

iOS16开始,苹果对窗口管理机制做了调整:

  • UIApplication.shared.windows的返回逻辑变更,不再保证最后一个窗口是当前活跃的主窗口
  • 系统键盘的窗口层级优化,直接通过addSubview添加到旧方式获取的窗口上,会被键盘窗口遮挡
  • 原代码中设置layer.zPosition = CGFloat(MAXFLOAT)的方式,在iOS16的窗口层级体系下不再生效

可行解决办法

方案1:使用系统推荐的inputAccessoryView(最稳妥)

苹果官方推荐通过输入框的inputAccessoryView实现键盘上方的自定义视图,无需手动管理层级和位置,系统会自动处理键盘弹出/收起时的视图附着:

// 初始化输入框时绑定表情视图
yourChatTextField.inputAccessoryView = self.emoticonView

// 切换表情视图显示/隐藏时,刷新输入框状态即可
func toggleEmoticonView() {
    yourChatTextField.inputAccessoryView = yourChatTextField.inputAccessoryView == nil ? self.emoticonView : nil
    // 刷新输入框的附件视图
    yourChatTextField.reloadInputViews()
}

方案2:手动获取正确的主窗口并调整层级

如果必须手动管理表情视图的层级,需要通过UIWindowScene获取当前活跃的主窗口,再将表情视图添加到该窗口并置顶:

// 1. 获取当前活跃的主窗口
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
      let keyWindow = windowScene.windows.first(where: { $0.isKeyWindow }) else {
    return
}

// 2. 根据键盘位置设置表情视图的frame(需提前监听键盘弹出通知获取keyboardHeight)
self.emoticonView.frame = CGRect(
    x: 0,
    y: keyWindow.bounds.height - keyboardHeight,
    width: keyWindow.bounds.width,
    height: 120 // 替换为你的表情视图高度
)

// 3. 添加到主窗口并置顶
keyWindow.addSubview(self.emoticonView)
keyWindow.bringSubviewToFront(self.emoticonView)

注意:需通过UIKeyboardWillShowNotification或UIKeyboardDidShowNotification监听键盘弹出事件,在回调中获取键盘的高度和位置,动态调整表情视图的frame。


内容的提问来源于stack exchange,提问作者헤이나우개발자

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:50:31