Ios SwiftUI:当列表太长时,搜索栏将移出边界

Ios SwiftUI:当列表太长时,搜索栏将移出边界,ios,swiftui,Ios,Swiftui,我已经在我的应用程序中的自定义标题中实现了一个搜索栏。在搜索栏下方,我添加了一个包含100行的假列表,用于显示搜索结果 我面临的问题是: 当列表出现时,搜索栏将移出边界。当我添加400px的顶部填充时,搜索栏返回到边界 接下来的两个有点离题 当键盘在屏幕上时,列表的最后几行不可见。如何修复它 如何为列表设置背景色?我还没弄明白。(listRowBackground修饰符没有按照我读到的一篇文章的建议工作。) 我使用的是Xcode 12.0 beta 6 let screen = UISc

我已经在我的应用程序中的自定义标题中实现了一个搜索栏。在搜索栏下方,我添加了一个包含100行的假
列表
,用于显示搜索结果

我面临的问题是:

  • 当列表出现时,搜索栏将移出边界。当我添加400px的顶部填充时,搜索栏返回到边界
接下来的两个有点离题

  • 当键盘在屏幕上时,列表的最后几行不可见。如何修复它
  • 如何为
    列表设置背景色
    ?我还没弄明白。(listRowBackground修饰符没有按照我读到的一篇文章的建议工作。)
我使用的是Xcode 12.0 beta 6

let screen = UIScreen.main.bounds

struct SearchBarView: View {
    @Binding var search: String
    @Binding var searchSelected: Bool
    
    var body: some View {
        VStack {
            CustomTextField(text: $search, isFirstResponder: true)
                .modifier(SearchBarTextFieldStyle(search: $search))

            if !search.isEmpty {
                  List(1..<100) { i in
                      Text("Hello \(i)")
                  }.frame(width: screen.width)
            }
        }
        .frame(width: screen.width, height: !search.isEmpty ? screen.height : 40)
        .background(Color("ThemeColor"))
    }
}
let screen=UIScreen.main.bounds
结构SearchBarView:视图{
@绑定变量搜索:字符串
@所选绑定变量:Bool
var body:一些观点{
VStack{
CustomTextField(文本:$search,isFirstResponder:true)
.modifier(SearchBarTextFieldStyle(搜索:$search))
如果!search.isEmpty{
清单(1。。
当列表出现时,搜索栏将移出边界
顶部填充为400px,搜索栏返回边界

问题是所有内容都放在一个
VStack
中。因此,当搜索不再为空时,
TextField
列表共享提供给它的空间

TextField
放在一个单独的堆栈中,如下所示:

struct ContentView: View {
    
    @State var search: String = ""
    
    var body: some View {
        // Everything wrapped in one Stack
        VStack() {
            
            // Separate Stack for the TextField 
            HStack() {
                TextField("Title", text: self.$search)
            }.padding()
            
            // One Stack for the content
            VStack {
                if !search.isEmpty {
                      List(1..<100) { i in
                          Text("Hello \(i)")
                      }.frame(width: UIScreen.main.bounds.width)
                }
            }.frame(width: UIScreen.main.bounds.width)
                .background(Color.red)
            
            Spacer() // So that the TextField is also on top when no content is displayed 
        }
    }
}
struct ContentView:View{
@状态变量搜索:String=“”
var body:一些观点{
//所有东西都包在一堆里
VStack(){
//TextField的单独堆栈
HStack(){
文本字段(“标题”,文本:self.$search)
}.padding()
//内容的一个堆栈
VStack{
如果!search.isEmpty{

列表(1..感谢您的回复。将
文本字段
列表
分开并不能解决问题,因为两者都有相同的父容器。但是,我做了一个变通,用键盘高度降低了父容器的高度(如您所建议的)并添加了一个
间隔符
。这解决了两个问题,将搜索栏带到边界,并从
列表中取消隐藏行。您为
列表
背景色指向我的链接不适合我。可能是因为我无法很好地解释它,因为解决方案中没有给出任何解释。正如您在我的第一次访问中看到的示例
TextField
List
也共享一个父项。当没有
List
时,
Spacer
需要保持
TextField
在顶部。我刚刚在代码的注释中编写了它,但没有提到它。我提供的代码在iOS 13.5.1下为我工作。但很高兴你能解决它嘿!很抱歉回复太晚:'(很遗憾,我的设备上没有使用iOS 13,因此我无法对此发表评论。在iOS 14中,它似乎不起作用。无论如何,感谢您的回答。非常感谢。
import SwiftUI

struct ContentView: View {
    
    @State var search: String = ""
    
    var body: some View {
        VStack() {
            
            HStack() {
                TextField("Title", text: self.$search)
            }.padding()
            
            VStack {
                if !search.isEmpty {
                    List(1..<100) { i in
                        Text("Hello \(i)")
                    }.frame(width: UIScreen.main.bounds.width)
                        .padding(.bottom, 300) // here padding
                }
            }.frame(width: UIScreen.main.bounds.width)
                
            
            Spacer()
        }
    }
}