iOS 15 UINavigationBar 转场时顶部灰色半透明问题如何修复
问题根因
- 仅配置了
scrollEdgeAppearance,未同步配置standardAppearance:iOS 15起导航栏的常规展示状态、滚动边缘状态使用两套独立配置,转场过程中会读取standardAppearance配置,两者不一致就会出现灰色半透明异常 - 在UINavigationBar的扩展中重写
awakeFromNib仅对XIB/Storyboard创建的导航栏生效,纯代码创建的导航栏不会触发该方法,且扩展重写系统原生方法本身存在调用逻辑不稳定的问题 - 使用
configureWithDefaultBackground()会保留系统默认半透明属性,和isTranslucent = false的配置冲突
修复代码
推荐使用全局配置方案,在AppDelegate的application:didFinishLaunchingWithOptions:方法中添加如下代码:
if #available(iOS 15, *) { let appearance = UINavigationBarAppearance() // 配置不透明背景 appearance.configureWithOpaqueBackground() appearance.backgroundColor = .white // 清除阴影线为可选配置,按需设置 appearance.shadowColor = .clear // 必须同时配置两个状态的外观 UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance // 如果支持横屏紧凑模式,同步添加以下配置 // UINavigationBar.appearance().compactAppearance = appearance }
如果是针对个别导航控制器做定制,在导航控制器初始化时设置即可,不要在扩展中重写系统方法。
异常效果参考

内容的提问来源于stack exchange,提问作者tHatpart
相关产品推荐
相关产品推荐

