可在iOS 15中搜索的SwiftUI- .navigationBarDrawer(显示模式:.总是)

c0vxltue  于 2023-02-20  发布在  iOS
关注(0)|答案(2)|浏览(161)

我想使用新的. searchable修饰符和. navigationBarDrawer(显示模式:. always).但如果我启动App,搜索栏的默认位置已经"滚动"了。

但这正是我在App启动时想要实现的:

这是我的代码:

struct SearchView: View {
    @State var searchText = ""
    var body: some View {
        NavigationView {
            List {
                Text("Search Bar")
            }
            .navigationBarTitle("Search")
            .searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
        }
    }
}
jdgnovmf

jdgnovmf1#

Hacky解决方案,但它的工作:

struct ContentView: View {
@State var searchText = ""
var body: some View {
    NavigationView {
        ZStack {
            Rectangle()
                .fill(Color.white)
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 1)
            
            List {
                Text("Search Bar")
            }
        }
        .searchable(text: $searchText, placement:.navigationBarDrawer(displayMode: .always))
        
        .navigationBarTitle("Search", displayMode: .large)
    }
}

}

jtw3ybtb

jtw3ybtb2#

如果您可以使用依赖项,下面是使用SwiftUI-Introspect的解决方案

struct SearchView: View {
    @State var searchText = ""
    let names: [String] = ["Joe", "Dylan", "Jim", "Andy"]

    var body: some View {
        NavigationView {
            List {
                ForEach(names, id: \.self) { name in
                    Text(name)
                }
            }
            .navigationBarTitle("Search")
            .searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
            .introspectNavigationController { navigationController in
                navigationController.navigationBar.sizeToFit()
            }
        }
    }
}

基本上,我从这里找到了最初的UIKit答案,并发现要求navigationController调用sizeToFit()解决了这个问题(在我的测试中)。在documentation中,sizeToFit告诉导航栏根据自己的需要调整大小,即拥有一个大标题。
我相信这是iOS 15中的SwiftUI错误,现在在iOS 16+中得到了修复,因为在使用可搜索的.navigationBarDrawer(displayMode: .always)时不再发生这种行为。

相关问题