首页 > 解决方案 > SwiftUI ScrollView 键盘避免

问题描述

首先关。我知道 SwiftUI ScrollView 有局限性。我希望在这里解决这个问题。

我的问题是我有一个聊天框......所以一个带有 ScrollView 和文本输入的 VStack。我能够使文本输入适应键盘...即当您键入时,它会随着键盘向上移动。

问题是 ScrollView 失去了滚动位置。所以,如果你滚动到底部然后激活键盘……你就看不到底部了。它几乎就像一个 ZStack。

我想要的是模仿与 WhatsApp 相同的行为,它在输入新消息时保持滚动位置。

我知道 ScrollViewReader 和 scrollTo ......在这种情况下这似乎是一个 hack,我希望避免它。如果有的话,也许有与布局相关的修复?

标签: swiftui

解决方案


幸运的是,我能够通过添加.keyboardAdaptive()到 ScrollView文本输入以及从填充更改为偏移来解决这个问题

struct KeyboardAdaptive: ViewModifier {
    @State private var keyboardHeight: CGFloat = 0

    @State var offset: CGFloat
    
    func body(content: Content) -> some View {
        content
            .offset(y: -keyboardHeight)
            .onReceive(Publishers.keyboardHeight) {
                self.keyboardHeight = $0 == 0 ? 0 : $0 - offset
            }
    }
}

推荐阅读