ios 如何防止键盘被SwiftUI中的ScrollView滚动?

uklbhaso  于 2023-03-05  发布在  iOS
关注(0)|答案(1)|浏览(263)

让我们想象一下,像每个信使一样,都有ScrollView和TextField。
我想隐藏键盘(如果它是打开的)当有人在这个键盘上滚动时,我用scrollDismissesKeyboard来实现这个。
但有一些错误我无法解决:如果我开始滚动ScrollView,然后转到键盘,我的键盘也在滚动!
如何避免这种行为?谁知道呢?
我已经附上了一个GIF视频显示我的意思和一个小代码片段与SwiftUI视图,这是渲染这种行为。

这是一段代码:

import SwiftUI

struct TestKeyboard: View {
  @State var text: String = ""

  var body: some View {
    VStack {
      ScrollView {
        TextBox(text: "Test 1", color: .red)
        TextBox(text: "Test 2", color: .green)
        TextBox(text: "Test 3", color: .blue)
        TextBox(text: "Test 4", color: .red)
        TextBox(text: "Test 5", color: .green)
        TextBox(text: "Test 6", color: .blue)
      }
      .scrollDismissesKeyboard(.interactively)

      TextField(text: $text) {
        Text("Test Field")
      }
    }
  }
}

struct TestKeyboard_Previews: PreviewProvider {
  static var previews: some View {
    TestKeyboard()
  }
}

先谢谢你!

ffx8fchx

ffx8fchx1#

这就是交互式的意思,当您在键盘上方开始滚动并向下移动时,键盘将随之向下移动,然后将其关闭。如果您不希望键盘像这样关闭,您可以在向下或向上滚动或拖动textField本身时关闭键盘,如下所示

struct TextBox: View {
    let text: String
    let color: UIColor
    var body: some View {
        Text(text)
            .frame(width: 300, height: 300)
            .background(Color(uiColor: color))
    }
  }
 

struct ContentView: View {
    @State var text: String = ""
    @FocusState var focused: Bool

    var body: some View {
        VStack {
            ScrollView {
                TextBox(text: "Test 1", color: .red)
                TextBox(text: "Test 2", color: .green)
                TextBox(text: "Test 3", color: .blue)
                TextBox(text: "Test 4", color: .red)
                TextBox(text: "Test 5", color: .green)
                TextBox(text: "Test 6", color: .blue)
            }
            
            
            TextField(text: $text) {
                Text("Test Field")
            }
            .focused($focused)
            .gesture(DragGesture()
                .onEnded({ _ in
                    focused = false
                }))
        }
    }
}

你可以调整拖动手势,也许你想在向上滚动时打开键盘,在向下滚动时隐藏键盘,只需更改focused属性

相关问题