iOS 导航栏在手势返回取消后意外显示的解决方案
问题描述
在使用 FDFullscreenPopGesture 库实现全屏返回手势的项目中,遇到了一个导航栏显示异常的问题:1. 页面 A 跳转到页面 B(B 页面设置导航栏隐藏)在 B 页面进行手势返回操作手势过程中松手取消返回时B 页面的导航栏意外显示出来(本应保持隐藏状态)
问题分析
通过添加日志追踪,发现导航栏状态的改变是由 FDFullscreenPopGesture 库触发的:
// 导航栏状态变化的调用栈
0 Voice Chat -[RootNavigationController setNavigationBarHidden:animated:]
1 Voice Chat __109-[UINavigationController(FDFullscreenPopGesture) fd_setupViewControllerBasedNavigationBarAppearanceIfNeeded:]_block_invoke
2 Voice Chat -[UIViewController(FDFullscreenPopGesturePrivate) fd_viewWillAppear:]
问题的根源在于 FDFullscreenPopGesture 库通过 fd_prefersNavigationBarHidden 方法来管理导航栏的显示状态。当这个方法未实现时,库会使用默认值,导致导航栏状态不符合预期。
解决方案
在需要隐藏导航栏的视图控制器中实现 fd_prefersNavigationBarHidden 方法:
@implementation BGNewCodeLoginViewController
- (BOOL)fd_prefersNavigationBarHidden {
return YES; // 始终返回 YES 表示要隐藏导航栏
}
@end
原理解释
FDFullscreenPopGesture 库的工作机制:库通过 Runtime 在 UIViewController 中注入了导航栏管理相关的方法在视图控制器即将显示时(viewWillAppear),会调用 fd_prefersNavigationBarHidden 来决定导航栏状态手势返回取消时,也会触发这个机制通过实现这个方法,我们可以确保在所有情况下都保持正确的导航栏状态
注意事项
确保在使用 FDFullscreenPopGesture 库时,正确实现 fd_prefersNavigationBarHidden 方法2. 该方法的返回值应该与 isHidenNaviBar 属性保持一致这个解决方案不需要修改导航控制器的代码,保持了代码的清晰性
总结
这个问题看似简单,但涉及到了第三方库的实现机制。通过理解 FDFullscreenPopGesture 的工作原理,我们可以优雅地解决导航栏显示异常的问题。这个解决方案具有以下优点:代码侵入性低与库的实现机制完美配合易于维护和扩展希望这个经验能帮助遇到类似问题的开发者
发表回复