Как создать многострочный текст внутри ScrollView в SwiftUI?

Поскольку List не выглядит настраиваемым для удаления разделителей строк, я использую ScrollView с VStack внутри, чтобы создать вертикальную компоновку текстовых элементов. Пример ниже:

ScrollView {
    VStack {
        // ...
        Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mattis ullamcorper tortor, nec finibus sapien imperdiet non. Duis tristique eros eget ex consectetur laoreet.")
            .lineLimit(0)
    }.frame(width: UIScreen.main.bounds.width)
}

Полученный Text выводится усеченным на одну строку. За пределами ScrollView он отображается как многострочный. Как бы я достиг этого внутри ScrollView кроме явной установки высоты для Text фрейма?

Ответ 1

В Xcode 11 GM:

Для любого представления Text в стеке, вложенном в представление прокрутки, используйте обходной путь .fixedSize(horizontal: false, vertical: true):

ScrollView {
    VStack {
        Text(someString)
            .fixedSize(horizontal: false, vertical: true)
    }
}

Это также работает, если есть несколько многострочных текстов:

ScrollView {
    VStack {
        Text(someString)
            .fixedSize(horizontal: false, vertical: true)
        Text(anotherLongString)
            .fixedSize(horizontal: false, vertical: true)
    }
}

Если содержимое вашего стека является динамическим, работает то же решение:

ScrollView {
    VStack {
        // Place a single empty / "" at the top of your stack.
        // It will consume no vertical space.
        Text("")
            .fixedSize(horizontal: false, vertical: true)

        ForEach(someArray) { someString in
            Text(someString)
              .fixedSize(horizontal: false, vertical: true)
        }
    }
}

Ответ 2

Вы можете заставить представления заполнять их идеальный размер, например, в вертикальном ScrollView:

ScrollView {
    Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mattis ullamcorper tortor, nec finibus sapien imperdiet non. Duis tristique eros eget ex consectetur laoreet.")
        .fixedSize(horizontal: false, vertical: true)
}

Мне немного лучше, чем модифицировать рамку.

Ответ 3

Кажется, в SwiftUI есть ошибка. На данный момент вы должны указать высоту для вашего контейнера VStack

ScrollView {
      VStack {
           // ...
               Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mattis ullamcorper tortor, nec finibus sapien imperdiet non. Duis tristique eros eget ex consectetur laoreet.")
                    .lineLimit(nil)
            }.frame(width: UIScreen.main.bounds.width, height: 500)
       }

Ответ 4

Следующее работает для меня с бета- версией 3 - без проставок, без ограничений по ширине, гибких ограничений по высоте 👍:

ScrollView {
    VStack {
        Text(longText)
            .lineLimit(nil)
            .font(.largeTitle)
            .frame(idealHeight: .infinity)
    }
}

Ответ 5

Вам также может помочь этот ответ для GM Xcode 11:

fooobar.com/info/17814703/...

Суть в том, что внутри других Builder вам нужно добавить .fixedSize(horizontal: false, vertical: true) в ваш Text(), чтобы обернуть его.