iOS 弹框盖住Tabbar,跳转其他页面回来依然显示方案对比
内容提要
本文讨论了在iOS应用中实现弹框只在主页显示的需求。作者提出了四种解决方案,包括将弹框加在UIApplication.shared.keyWindow上、使用present半屏弹框款式、将tabbarViewController作为UINavigationController的rootViewController,以及创建一个高于UIApplication.shared.delegate.window的UIWindow来显示弹框。最终作者选择了第四种方案,并给出了具体的代码实现。
延伸解读
方案对比:从闪现问题到结构改动
文章对比了四种方案。方案一将弹框加在keyWindow上,但依赖viewDidAppear和viewDidDisappear控制显隐,导致侧滑返回时弹框闪现。方案二使用present半屏弹框,与全屏需求不符且背景VC会缩小。方案三调整项目结构,将TabBarController嵌入UINavigationController,虽能解决层级问题,但影响路由和页面判断,改动范围大。方案四通过独立UIWindow实现,改动局部,最终被采用。
独立UIWindow方案的核心机制
方案四创建了一个windowLevel为.alert的UIWindow,其rootViewController为UINavigationController,根视图控制器是自定义的FJFDialogViewController。该控制器重写loadView生成FJFDialogView,并在viewDidAppear和viewDidDisappear中调用FJFDialogWindowManager检查弹框状态。FJFDialogView重写addSubview和willRemoveSubview,在子视图增减时触
路由适配与影响范围控制
为支持从弹框内跳转,路由方法增加了isAlertWindow参数。当跳转来自弹框时,从alertWindow获取UINavigationController进行push,使新页面能盖住弹框。这种改动仅针对特定弹框,不影响其他页面,测试范围也集中在这些弹框上。但需注意,获取活跃VC时需根据windowLevel区分普通窗口和弹框窗口,避免误判。
Q&A
如何在iOS应用中实现弹框只在主页显示?
可以通过创建一个高于UIApplication.shared.delegate.window的UIWindow来显示弹框,确保弹框只在主页显现。
弹框在不同页面显示的问题是什么?
弹框的层级问题导致在跳转到其他页面后,弹框仍然显现,影响用户体验。
有哪些方案可以解决弹框显示问题?
提出了四种方案,包括将弹框加在keyWindow上、使用半屏弹框、改变项目结构、以及创建高层级UIWindow。
选择哪种方案来实现弹框显示?
最终选择了创建一个高于UIApplication.shared.delegate.window的UIWindow的方案。
如何管理弹框的显示状态?
通过FJFDialogWindowManager管理弹框的显示状态,确保在适当时机显现或隐藏弹框。
在实现中如何控制弹框的显现与隐藏?
重写loadView和viewDidAppear等方法来控制弹框的显现与隐藏。