NilCoalescing / SwiftUI-Code-Examples

In this repository we are collecting our solutions to interesting SwiftUI problems that we encounter when developing our apps.
MIT License
254 stars 40 forks source link

Expandable-text-with-line-limit example bug #5

Open mobileuidev opened 1 year ago

mobileuidev commented 1 year ago

When I try to use viewThatFits as described in the Expandable-text-with-line-limit.swift example but with a LazyVStack shows the button incorrectly when scrolling up and down, copy and paste the following code to try it out:

struct ContentView: View {

    var items = ["this is test text",

                 "this is test text this is test text",

                 " this is test text this is test text this is test text",

                 "this is test text this is test text this is test text this is test text",

                 "this is test text this is test text this is test text this is test text this is test text",

                 "this is test text this is test text this is test text this is test text this is test text this is test text",

                 "this is a small text",

                 "this is test text this is test text this is test text this is test text this is test text this is test text this is test text this is test text",

                 "this is test text this is test text this is test text this is test text this is test text this is test text this is test text this is test text this is test text",

                 "this is test text this is test text this is test text this is test text this is test text this is test text this is test text this is test text this is test text this is test text",

                 "this is test text this is test text this is test text this is test text this is test text this is test text this is test text this is test text this is test text this is test text this is test text",
    ]

    var body: some View {
        ScrollView {
            LazyVStack(spacing: 0) {
                ForEach(items, id: \.self) { item in
                   ExpandableTextWithLineLimit(text: item, initialLineLimit: 2)
                        .padding()
                }
            }
        }

    }
}

However, this issue doesn't happen with a VStack, but I need to use LazyVStack to simulate async data rendering.

nataliapanferova commented 1 year ago

@mobileuidev might be something to do with how the size of text is calculated when it appears on screen in a LazyVStack, I'll add a note to my article mentioning that.

I'll let you know if I come up with a different solution, in the meantime you might need to set the initial height on the view, like in the example from Expandable-text-with-constrained-height.swift.

mobileuidev commented 1 year ago

@nataliapanferova someone on SO added an answer to my question, I guess it's an acceptable solution for this issue.