SwiftUI向导航栏添加UISearchBar不显示及位置异常问题求助
解决方案
- 第一步:优化UISearchBar的封装适配,添加自动布局适配和默认样式优化
struct SearchBar2: UIViewRepresentable { @Binding var text: String var placeholder: String = "搜索" func makeUIView(context: Context) -> UISearchBar { let searchbar = UISearchBar(frame: .zero) searchbar.placeholder = placeholder // 去掉默认背景,适配导航栏样式 searchbar.backgroundImage = UIImage() // 自动适配父视图大小 searchbar.autoresizingMask = [.flexibleWidth, .flexibleHeight] searchbar.delegate = context.coordinator return searchbar } func updateUIView(_ uiView: UISearchBar, context: Context) { uiView.text = text } // 协调器处理搜索文本变化,可选配置 func makeCoordinator() -> Coordinator { Coordinator(text: $text) } class Coordinator: NSObject, UISearchBarDelegate { @Binding var text: String init(text: Binding<String>) { _text = text } func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { text = searchText } } }
- 第二步:调整页面布局,将搜索栏放置到导航栏专属位置
// 提前声明搜索文本状态变量 @State private var text = "" var body: some View { NavigationView { VStack { NavigationLink { InitView() } label: { // 补全你的NavigationLink显示内容 Text("跳转初始化页面") } .buttonStyle(PlainButtonStyle()) ZStack { HStack { // 原有自定义内容 } } DayView() } // 导航栏配置放在NavigationView的子视图层级 .navigationTitle("") // 隐藏默认标题,腾出位置给搜索栏 .toolbar { // 指定ToolbarItem的布局位置为导航栏区域 ToolbarItem(placement: .navigationBar) { SearchBar2(text: $text) // 固定宽度适配导航栏边距 .frame(width: UIScreen.main.bounds.width - 32) } } } }
核心调整逻辑:
- 之前直接把自定义SearchBar放在toolbar根下,没有指定
ToolbarItem的布局位置,系统无法识别要放在导航栏区域- UISearchBar默认没有添加适配父视图的自动布局规则,会出现尺寸异常,添加
autoresizingMask后可以自动适配SwiftUI的frame设置- 清空navigationTitle可以避免导航栏默认标题占用空间,让搜索栏完全填充导航栏宽度
- 如果项目最低支持iOS16,建议把
NavigationView替换为NavigationStack,适配性更好
内容的提问来源于stack exchange,提问作者Gigi Prabhakaran
相关产品推荐
相关产品推荐

