SwiftUI pin部分列表至底部
我有一个聊天信息列表,在最后添加新信息时会向上滚动。但是,如果视图中的消息太少,它们会固定在顶部 有没有办法把里面的东西钉在底部 请注意,在这种情况下,视图位于SwiftUI pin部分列表至底部,swift,swiftui,ios14,Swift,Swiftui,Ios14,我有一个聊天信息列表,在最后添加新信息时会向上滚动。但是,如果视图中的消息太少,它们会固定在顶部 有没有办法把里面的东西钉在底部 请注意,在这种情况下,视图位于UIHostingController内 struct OverlayChatView: View { @ObservedObject public var stream: ChatStream var body: some View { ScrollViewReader { scrollVie
UIHostingController
内
struct OverlayChatView: View {
@ObservedObject public var stream: ChatStream
var body: some View {
ScrollViewReader { scrollView in
ScrollView {
LazyVStack(alignment: .leading, spacing: 0.0) {
ForEach(self.stream.messages) { inMsg in
ChatMessageCell(message: inMsg)
}
.padding(8)
}
}
.onAppear {
if self.stream.messages.count > 0
{
scrollView.scrollTo(self.stream.messages.last!.id, anchor: .bottom)
}
}
.onChange(of: self.stream.messages, perform: { inMessages in
if inMessages.count < 1 { return }
withAnimation(.linear(duration: 0.25)) {
scrollView.scrollTo(inMessages.last!.id, anchor: .bottom)
}
})
}
}
}
struct overlychatView:视图{
@ObservedObject公共变量流:ChatStream
var body:一些观点{
ScrollViewReader{scrollView in
滚动视图{
LazyVStack(对齐:。前导,间距:0.0){
ForEach(self.stream.messages){inMsg in
ChatMessageCell(消息:inMsg)
}
.填充(8)
}
}
奥纳佩尔先生{
如果self.stream.messages.count>0
{
scrollView.scrollTo(self.stream.messages.last!.id,锚点:.bottom)
}
}
.onChange(of:self.stream.messages,在中执行:{inMessages
如果inMessages.count<1{return}
带动画(.linear(持续时间:0.25)){
scrollView.scrollTo(inMessages.last!.id,锚点:.bottom)
}
})
}
}
}
您可以根据内容高度和整个滚动视图高度之间的差异,使用动态大小的垫片。如果内容较小,则显示一个间隔符
——如果不是,则只显示内容
struct ContentView: View {
@State private var contentHeight : CGFloat = 0
@State private var totalHeight : CGFloat = 0
var body: some View {
ScrollViewReader { scroller in
ScrollView {
if contentHeight < totalHeight {
Spacer().frame(height: totalHeight - contentHeight)
}
VStack {
Text("My content")
Text("More content")
}
.frame(maxWidth: .infinity)
.background(GeometryReader {
Color.clear.preference(key: ContentHeight.self,
value: $0.frame(in: .local).size.height)
})
.onPreferenceChange(ContentHeight.self) { contentHeight = $0 }
}
.background(GeometryReader {
Color.clear.preference(key: TotalHeight.self,
value: $0.frame(in: .local).size.height)
})
.border(Color.red)
.onPreferenceChange(TotalHeight.self) { totalHeight = $0 }
}
}
struct TotalHeight : PreferenceKey {
static var defaultValue: CGFloat { 0 }
static func reduce(value: inout Value, nextValue: () -> Value) {
value = value + nextValue()
}
}
struct ContentHeight : PreferenceKey {
static var defaultValue: CGFloat { 0 }
static func reduce(value: inout Value, nextValue: () -> Value) {
value = value + nextValue()
}
}
}
结构ContentView:View{
@国家私有变量contentHeight:CGFloat=0
@国家私有变量totalHeight:CGFloat=0
var body:一些观点{
ScrollViewReader{中的滚动条
滚动视图{
如果contentHeight值){
value=value+nextValue()
}
}
结构内容高度:PreferenceKey{
静态var defaultValue:CGFloat{0}
静态func REDUCT(值:inout值,nextValue:()->值){
value=value+nextValue()
}
}
}
更新了帖子以显示代码。这是否回答了您的问题?还没有机会尝试,但我会尝试!我想我将提交一个bug,请求对此提供内置支持,因为这需要大量的工作!可以如果答案有帮助的话,向上投票总是好的。