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,提问作者헤이나우개발자
相关产品推荐
相关产品推荐

