Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI pin部分列表至底部_Swift_Swiftui_Ios14 - Fatal编程技术网

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,请求对此提供内置支持,因为这需要大量的工作!可以如果答案有帮助的话,向上投票总是好的。