Xcode更新后应用拖拽当前视图返回根控制器,如何修复?
我之前也碰到过类似的情况,大概率是Xcode更新后对应的iOS SDK默认的模态视图(modal)展示行为发生了变化,结合你的描述,给你几个针对性的解决办法:
1. 修改模态视图的展示样式
iOS 13及以后,系统默认的模态视图展示样式是pageSheet,这种样式会保留根视图的背景显示,并且支持下拉手势关闭当前视图。如果你的应用之前是用全屏展示的,更新后默认行为改变就会出现这个问题。
代码方式(UIKit)
在present当前视图控制器的时候,手动设置展示样式为.fullScreen:
let targetVC = YourCurrentViewController() targetVC.modalPresentationStyle = .fullScreen // 如果是通过导航控制器present,就用navigationController?.present present(targetVC, animated: true)
Storyboard方式
选中你的当前视图控制器,打开右侧的Attributes Inspector(属性检查器),找到Presentation选项,将默认的Automatic改成Full Screen即可。
2. 保留Sheet样式但禁用下拉关闭
如果你想保留pageSheet的半透明背景样式,但不希望用户通过下拉手势关闭视图,可以在当前视图控制器的viewDidLoad方法中添加以下代码:
override func viewDidLoad() { super.viewDidLoad() // 禁用下拉关闭手势 isModalInPresentation = true }
设置后用户下拉只会得到震动反馈,不会触发视图关闭操作。
3. 检查视图延伸配置
如果当前视图的内容和根视图的内容出现重叠,也可能是视图延伸属性的问题。可以尝试关闭当前视图控制器的边缘延伸:
override func viewDidLoad() { super.viewDidLoad() edgesForExtendedLayout = [] }
或者在Storyboard中,选中当前视图控制器,在Attributes Inspector的Extend Edges区域,取消勾选所有选项(比如Under Top Bars、Under Bottom Bars等)。
4. 检查导航控制器的嵌套配置
如果你是通过导航控制器push的方式展示当前视图,那下拉返回根控制器可能是误开启了interactivePopGestureRecognizer的特殊配置。可以检查是否有代码修改了这个手势的代理,或者尝试重置:
navigationController?.interactivePopGestureRecognizer?.delegate = self // 或者如果不需要这个手势,直接禁用 navigationController?.interactivePopGestureRecognizer?.isEnabled = false
以上几个方法应该能解决你遇到的问题,你可以根据自己的业务需求选择合适的方案。
内容的提问来源于stack exchange,提问作者user10311441

