iOS 16中如何让UINavigationBar始终显示模糊效果?
核心思路
iOS 16里导航栏的模糊效果默认和滚动视图的滚动状态绑定,要让它在无滚动时也保持模糊,核心是统一滚动边缘外观(scrollEdgeAppearance)和标准外观(standardAppearance)的配置,让两者都使用带模糊的样式。
具体实现步骤
1. 统一导航栏外观配置
在视图控制器的viewDidLoad中创建并配置UINavigationBarAppearance实例,让所有场景下的导航栏都使用模糊样式:
let navAppearance = UINavigationBarAppearance() // 配置透明背景以显示模糊效果 navAppearance.configureWithTransparentBackground() // 设置模糊风格,可根据需求替换为.systemMaterialDark等 navAppearance.backgroundEffect = UIBlurEffect(style: .systemMaterial) // 关键:让标准外观、滚动边缘外观、紧凑布局外观都使用同一配置 navigationController?.navigationBar.standardAppearance = navAppearance navigationController?.navigationBar.scrollEdgeAppearance = navAppearance navigationController?.navigationBar.compactAppearance = navAppearance navigationController?.navigationBar.compactScrollEdgeAppearance = navAppearance
2. 辅助配置(解决潜在布局问题)
如果配置后仍有异常,可添加以下设置确保效果稳定:
// 强制启用滚动边缘外观逻辑 navigationController?.navigationBar.isScrollEdgeAppearanceEnabled = true // 确保TableView布局适配导航栏,避免偏移 tableView.contentInsetAdjustmentBehavior = .automatic
3. 避坑提示
- 不要设置
navigationBar.isTranslucent = false,这会直接关闭导航栏的模糊效果 - 若有自定义标题、按钮样式,需在
UINavigationBarAppearance中同步配置(如titleTextAttributes),避免样式割裂 - SwiftUI项目可通过
.toolbarBackground(.ultraThinMaterial, for: .navigationBar)结合.toolbarBackground(.visible, for: .navigationBar)实现相同效果
效果验证
完成配置后,无论UITableView是否处于滚动状态,UINavigationBar都会持续保持模糊背景,不会在停止滚动后切换到非模糊样式。
内容的提问来源于stack exchange,提问作者Gralex
相关产品推荐
相关产品推荐

