iOS 15 SwiftUI .searchable()搜索栏外观自定义适配导航栏配色问题
iOS 15 SwiftUI .searchable() 搜索栏外观自定义方案
问题根因
iOS 15 对导航栏、搜索栏的外观渲染逻辑做了重构,默认自带系统模糊效果层,直接设置UISearchBar.appearance()的backgroundColor会被上层的模糊层覆盖,因此仅能生效部分样式;另外你原代码中tintColor设为白色会和背景色重合,导致光标、取消按钮不可见。
修复方案
全局适配(推荐,适配全App搜索栏样式)
将以下代码放在SwiftUI App入口的初始化方法中,直接覆盖系统默认外观:
@main struct YourApp: App { init() { // 清除搜索栏默认模糊背景 UISearchBar.appearance().backgroundImage = UIImage() // 设置搜索栏背景为白色 UISearchBar.appearance().backgroundColor = .white // 配置搜索栏内输入框样式 let searchTextField = UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]) searchTextField.backgroundColor = .white searchTextField.textColor = .darkText // 调整输入内容边距解决间距异常问题 UISearchBar.appearance().searchTextPositionAdjustment = UIOffset(horizontal: 8, vertical: 0) // 配置光标、取消按钮颜色,注意不要和背景色重合 UISearchBar.appearance().tintColor = .systemBlue // 同步配置导航栏外观保证视觉统一 let navAppearance = UINavigationBarAppearance() navAppearance.backgroundColor = .white navAppearance.shadowColor = .clear // 可选:移除导航栏底部分割线 UINavigationBar.appearance().standardAppearance = navAppearance UINavigationBar.appearance().scrollEdgeAppearance = navAppearance } var body: some Scene { WindowGroup { ContentView() } } }
单页面局部适配(不影响其他页面样式)
如果仅需要单个页面的搜索栏为白色,在对应页面的生命周期方法中临时修改外观,离开页面时恢复默认即可:
struct TargetView: View { @State private var searchText = "" var body: some View { NavigationStack { List { // 列表内容 } .searchable(text: $searchText) .onAppear { UISearchBar.appearance().backgroundImage = UIImage() UISearchBar.appearance().backgroundColor = .white // 其他自定义配置 } .onDisappear { // 恢复默认外观 UISearchBar.appearance().backgroundImage = nil UISearchBar.appearance().backgroundColor = nil } } } }
内容的提问来源于stack exchange,提问作者Jon Vogel
相关产品推荐
相关产品推荐

