如何解决当键盘出现在垂直 ScrollView SwiftUI 内的水平 ScrollView 中时,向上移动 TextField
前段时间有一个相关的问题: Move TextField up when the keyboard has appeared in SwiftUI
好像之前的问题已经解决了。但是,如果我们将 vstack 放在 ScrollView 中。 SwiftUI 似乎忽略了键盘安全区域并将滚动视图保留在键盘后面。有了一个垂直滚动视图和一个文本字段,我们仍然可以获得所需的行为,滚动视图向上滚动到文本字段。如果我们在垂直滚动视图中使用水平滚动视图,就会出现问题。滚动视图不会向上移动以使文本字段可见。有大佬知道怎么解决吗?
struct ContentView: View {
@State var text = ""
var body: some View {
ScrollView(.vertical,showsIndicators: false) {
vstack {
ForEach(0..<10) {_ in
ScrollView(.horizontal,showsIndicators: false) {
HStack(spacing: 20) {
ForEach(0..<10) {_ in
vstack {
Rectangle()
.fill(Color.red)
.frame(width: 500,height: 300)
TextField("Test",text: $text)
}
}
}
}
}
}
}
}
}
解决方法
尝试创建扩展以查看:
extension View {
func keyboardSensible(_ offsetValue: Binding<CGFloat>,contentHeight: CGFloat) -> some View {
return self
.padding(.bottom,offsetValue.wrappedValue)
.animation(.spring())
.onAppear {
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification,object: nil,queue: .main) { notification in
let keyWindow = UIApplication.shared.connectedScenes
.filter({$0.activationState == .foregroundActive})
.map({$0 as? UIWindowScene})
.compactMap({$0})
.first?.windows
.filter({$0.isKeyWindow}).first
let userFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect ?? .zero
offsetValue.wrappedValue = userFrame.height
}
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification,queue: .main) { _ in
offsetValue.wrappedValue = 0
}
}
}
}
内容调整的使用示例:
@State private var offsetValue: CGFloat = 0.0
var body: some View {
GeometryReader { geometryReader in
VStack {
...
}.keyboardSensible(self.$offsetValue,contentHeight: geometryReader.size.height)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。