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

iOS 16 UI问题:弹出UIAlertController时键盘触发致弹窗上移

解决iOS 16中UIAlertController随键盘上移的问题

要在iOS 16中实现iOS <16的表现(键盘显示在UIAlertController前方,弹窗不自动上移),可以尝试以下两种方案:

方案一:修改系统UIAlertController的窗口行为

通过监听键盘通知,调整UIAlertController所在窗口的层级和自动调整属性,强制保持弹窗位置并让键盘显示在前方:

import UIKit

class ViewController: UIViewController {
    private var alertController: UIAlertController?
    
    func showCustomBehaviorAlert() {
        let alert = UIAlertController(title: "提示", message: "测试弹窗与键盘交互", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default))
        
        present(alert, animated: true)
        alertController = alert
        
        // 注册键盘通知
        NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardShow), name: UIKeyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardHide), name: UIKeyboardWillHideNotification, object: nil)
    }
    
    @objc private func handleKeyboardShow(_ notification: Notification) {
        guard #available(iOS 16.0, *), let alert = alertController else { return }
        
        DispatchQueue.main.async {
            guard let alertWindow = alert.view.window else { return }
            // 禁用窗口自动调整子视图,阻止弹窗上移
            alertWindow.autoresizesSubviews = false
            // 将弹窗窗口层级设为低于键盘(键盘层级为UIWindowLevelAlert + 1),让键盘显示在前方
            alertWindow.windowLevel = UIWindowLevelAlert - 1
        }
    }
    
    @objc private func handleKeyboardHide(_ notification: Notification) {
        guard #available(iOS 16.0, *), let alert = alertController else { return }
        
        DispatchQueue.main.async {
            guard let alertWindow = alert.view.window else { return }
            // 恢复窗口默认属性
            alertWindow.autoresizesSubviews = true
            alertWindow.windowLevel = UIWindowLevelAlert
        }
    }
    
    deinit {
        // 移除通知监听
        NotificationCenter.default.removeObserver(self)
    }
}

方案二:使用自定义弹窗替代系统UIAlertController

如果修改系统控件行为存在兼容性风险,推荐自己实现弹窗组件,完全控制其布局和键盘交互逻辑。例如通过UIView封装弹窗,设置固定位置,监听键盘事件时不调整弹窗位置,同时确保键盘窗口层级高于弹窗。

这种方案更稳定,不受iOS系统版本更新的影响,适合需要长期维护的应用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:56:45