SwiftUI -调整ScrollView滚动指示器的插入



我正在创建一个聊天应用程序,我希望ScrollView的内容在输入字段下面(同时向上滚动)。我已经把ScrollView和输入字段放到了ZStack中。在ScrollView的底部填充内容,但我也希望滚动指示器移动与内容。

是否有任何方法可以改变滚动指示器的插入以匹配填充,或任何其他解决方案来实现我正在寻找的?

下面是当前代码:

ZStack(alignment: .bottom) {
ScrollView {
ScrollViewReader { value in
VStack(spacing: 5) {
ForEach(MOCK_MESSAGES) {
mMessage in
MessageView(mMessage: mMessage)
}
.onAppear {
value.scrollTo(MOCK_MESSAGES.count - 1)
}
}
.padding(.top, 10)
.padding(.bottom, 40)
}
}
MessageInputView(messageText: $messageText)
}
总结:我们的想法是让ScrollView在输入视图的上方,但是当向上滚动时将内容移动到输入视图的下方。

iOS 15/斯威夫特3

你可以用.safeAreaInset来代替填充,然后它也会为你处理滚动指示器的插入。

ScrollView {
ScrollViewReader { value in
VStack(spacing: 5) {
// stuff
}
}
}
.safeAreaInset(edge: .bottom) {
MessageInputView(messageText: $messageText)
}

注意:.safeAreaInsets似乎不能在Xcode 13.1的List上工作。

更新:作为iOS 15.2,safeAreaInsets()工作与列表和表单以及。

iOS 14/Swift 2或with List

就像SwiftUI中的许多事情一样,如果不修改底层的UIKit组件,似乎没有办法做到这一点。对于这个问题,有一个简单的解决方案,使用introspection库:

ZStack(alignment: .bottom) {
ScrollView {
ScrollViewReader { value in
VStack(spacing: 5) {
// stuff
}
.padding(.top, 10)
.padding(.bottom, 40)
}
}
.introspectScrollView { sv in
sv.verticalScrollIndicatorInsets.top = 10
sv.verticalScrollIndicatorInsets.bottom = 40
}
MessageInputView(messageText: $messageText)
}

你也可以用ListintrospectTableView来做。

最新更新