SwiftUI - 可滚动的 ListView,对象未正确呈现

Posted

技术标签:

【中文标题】SwiftUI - 可滚动的 ListView,对象未正确呈现【英文标题】:SwiftUI - Scrollable ListView, Objects Not Rendering Properly 【发布时间】:2021-01-08 06:56:44 【问题描述】:

我正在尝试使用自定义“项目”来实现 ScrollView,但由于某种原因,每个项目都呈现堆叠在一起。

这里是返回包含项目 VStack 的 ScollView 的方法。

private func dailyEventsView(width: CGFloat) -> some View 
        
        var events = dailyData.getEvents()
        
        return ScrollView 
            VStack(alignment: .center, spacing: 10) 
                ForEach (0 ..< events.count)  i in
                    if (events[i].getType() == EventType.WATER) 
                        WaterCardView(event: events[i] as! WaterEvent)
                            .frame(width: width)
                    
                
            
        
    

这里是“WaterCadView”。

struct WaterCardView : View 
    
    @ObservedObject var event: WaterEvent
    
    var body: some View 
        GeometryReader  geometry in
            ZStack 
                RoundedRectangle(cornerRadius: 25.0).fill(Color.gray).opacity(0.05)
                
                VStack(alignment: .leading) 
                    event.getCardViewHeader()

                    // Just a series of progress bars, does not affect output.
                    WaterProgressBar(max: event.max, progress: event.progress, current: event.current)
                        // Height should be same as progress bar thickness
                        .frame(height: 10.0)
                .padding()
            
        
        .padding(.leading, 10)
        .padding(.trailing, 10)
    

这是输出...

Simulator output

不知道我做错了什么。我已经在很多 Scrollable 列表视图中多次使用这种方法,我可能错过了一些小东西,但任何一个都将不胜感激!

【问题讨论】:

【参考方案1】:

不要在任何可滚动容器中没有明确设置限制的情况下使用GeometryReader,因为它会混淆 SwiftUI 布局引擎(您可以观察到)。

在你的场景中,我假设你想要类似的东西

struct WaterCardView : View 
    
    @ObservedObject var event: WaterEvent
    
    var body: some View 
        VStack(alignment: .leading) 
            event.getCardViewHeader()

            // Just a series of progress bars, does not affect output.
            WaterProgressBar(max: event.max, progress: event.progress, current: event.current)
                // Height should be same as progress bar thickness
                .frame(height: 10.0)
        .padding()
        .background(
            RoundedRectangle(cornerRadius: 25.0).fill(Color.gray).opacity(0.05)
        )
        .padding(.leading, 10)
        .padding(.trailing, 10)
    

【讨论】:

哇,它修好了。您能否更深入地了解 GeomtryReader 的工作原理?当我需要制作相对于彼此的子视图,或者需要一些与帧大小相关的数学运算时,我倾向于经常使用它。我是 SwiftUI 的新手,来自 android...

以上是关于SwiftUI - 可滚动的 ListView,对象未正确呈现的主要内容,如果未能解决你的问题,请参考以下文章

使包含 ListView 的整个布局可滚动

如何在 tvOS 中使 SwiftUI 列表可滚动

没有部分的 SwiftUI 主列表可滚动标题视图?

可滚动的 Activity,不可滚动的 ListView - Android

即使我总是可滚动,我的 Listview 也不会滚动

可滚动的 ListView 将背景颜色渗入相邻的小部件