TextField(_:text:axis:) 打破了 iOS 16 中 ScrollView 内的键盘回避

Ada*_*ger 6 ios swift swiftui ios16

TextField如果它是常规的(即不在 上扩展的axis),无论它是否包含在 a 中,自动键盘避免似乎都能正常工作。ScrollView

如果只是将TextField(_:text:axis)其简单地放置在 a 中VStack而不是包装在ScrollView. 随着更多文本的高度扩展,它甚至会继续正确地避开键盘。

TextField(_:text:axis)但如果它被放置在一个内部,我似乎无法避免使用键盘ScrollView

我可以采用一种老套的方法,即当焦点被聚焦时,使用ScrollViewReader与 组合DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(400))来包裹。当您第一次聚焦该领域时,这种方法有效,但我似乎无法在扩展时继续调整其位置。proxy.scrollTo()TextFieldScrollViewTextField

这是一个例子:

struct KeyboardAvoidingView: View {
    @State var text = ""
    
    var body: some View {
        ScrollViewReader { proxy in
            ScrollView {
                VStack {
                    Color.red
                        .frame(height: 400)
                    Color.blue
                        .frame(height: 400)
                    TextField("Name", text: $text, axis: .vertical)
                        .padding(.vertical)
                        .onTapGesture {
                            DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(400)) { 
                                withAnimation(.default) {
                                    proxy.scrollTo(0)
                                }
                            }
                        }
                        .onChange(of: text) { newValue in
                            proxy.scrollTo(0)   // This doesn't seem to do anything
                        }
                    Spacer()
                        .frame(height: 0)
                        .id(0)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想我想知道这是预期的行为还是错误。不管是其中之一,我想知道是否可以在滚动视图内有一个自动扩展的文本字段,即使字段的高度扩展,我也可以避免使用键盘?


更新:事实证明,问题在于将a而不是 a放在TextField里面。我认为在某些情况下不知道如何处理普通人。如果我在示例中将替换为 a ,一切都会按预期进行!VStackLazyVStackScrollViewVStackVStackLazyVStack

Ada*_*ger 5

我用上面发布的更新回答了这个问题。问题在于使用VStack而不是LazyVStack