微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当键盘出现在垂直 ScrollView SwiftUI 内的水平 ScrollView 中时,向上移动 TextField

如何解决当键盘出现在垂直 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)
                                    
                                }
                            }
                        }
                    }
                    
                }
            }
            
        }
        
    }
}

enter image description here

enter image description here

解决方法

尝试创建扩展以查看:

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 举报,一经查实,本站将立刻删除。