Text.lineLimit() behavior is inconsistent in SwiftUI

Viewed 6147

I have some description text in a VStack, and I'd like to limit it to 3 lines. My understanding is that I modify Text() with a .lineLimit(3) modifier. However, when I do this, some of the descriptions get capped at 3 lines, while others get capped at 1. There doesn't seem to be any consistency as to where this happens.

I thought this could be the order in which I'm calling the modifier attributes, but switching the order of .font(.body) and .lineLimit doesn't change anything. I also tried removing the .padding(), and that doesn't work either.

List(clubData) { club in
            VStack(alignment: .leading) {

                Text(club.name)
                    .font(.title)
                    .lineLimit(nil)

                Text(club.subtitle)
                    .lineLimit(4)
                    .font(.body)
            }
            .padding()
        }

Here's an image of what's happening:

enter image description here

5 Answers

You might also be helped with this answer for the Xcode 11 GM:

https://stackoverflow.com/a/56604599/30602

The summary is that inside other Builders you need to add .fixedSize(horizontal: false, vertical: true) to your Text() to get it to wrap.

I've experienced this.

For now if you wrap your views in a GeometryReader then it should respect the line limits

e.g.

GeometryReader { _ in
    VStack(alignment: .leading) {
       ...
    }
}

The answer is to download Xcode 11.2 BETA. Xcode 11 GM in The App Store also have the problem with .linelimit(nil) being capped at one line.

Dec 12th, 2019 with Xcode 11.2.1

DO NOT trust .lineLimit, use frame to set appropriate height (according to your font size) to wrap your multi-lined text. And, DO NOT use .lineSpacing even you think you make enough height, SwiftUI must have a really 'special' way to determine if the VStack height is enough and how many lines to display.

April 23, 2020, Xcode 11.4

In my case, I get movie description text from TMDB API, which is in dynamic length. And it is embedded in VStack.

It is really annoyed. Even I set .linelimit(nil), the line for description text, it will still have a limit and end up ignoring some text as "long decription...".

Related