Как создать многострочный текст внутри ScrollView в SwiftUI? - PullRequest
9 голосов
/ 14 июня 2019

Поскольку 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?

Ответы [ 3 ]

6 голосов
/ 14 июня 2019

In Xcode Beta 3 :

Если у вас есть одно представление Text в стеке, вложенном в представление прокрутки, использует обходной путь frame(idealHeight: .infinity):

ScrollView {
    VStack {
        Text(someString)
            .lineLimit(nil)
            .frame(idealHeight: .infinity)
    }
}

Если имеется несколько многострочных текстов, удалите .frame из более поздних представлений:

Если в стеке несколько элементов Text, иприменив frame(idealHeight: .infinity) к нескольким, вы обнаружите сбои SwiftUI в коде макета стека по адресу: StackLayout.Header.init(layoutContext:proxies:majorAxis:minorAxisAlignment:uniformSpacing:childStorage:capacity:).

Чтобы обойти это, примените только idealHeight к первому Text представлению.По крайней мере, в бета-версии 3 это имеет побочный эффект, заключающийся в переносе более поздних Text представлений.

ScrollView {
    VStack {
        Text(someString)
            .lineLimit(nil)
            .frame(idealHeight: .infinity) // Only to the first!
        Text(anotherLongString)
            .lineLimit(nil)
    }
}

Если содержимое вашего стека является динамическим, используйте этот прием:

Один пустой Text("") вид сверху с frame(idealHeight: .infinity) будет иметь побочный эффект от переноса более поздних текстовых узлов.

ScrollView {
    VStack {
        // Place a single empty / "" at the top of your stack.
        // It will consume no vertical space.
        Text("")
            .lineLimit(nil)
            .frame(idealHeight: .infinity)

        ForEach(someArray) { someString in
            // Omit the `idealHeight: .infinity` trick from
            // all the later Text views.
            Text(someString)
                .lineLimit(nil)
        }
    }
}

Предупреждение:

.frame(idealHeight: .infinity) не работает, если у вас в стеке Spacer().

Сбой следующего:

ScrollView {
    VStack {
        Text(someString)
            .lineLimit(nil)
            .frame(idealHeight: .infinity)
        Spacer()
    }
}

... за исключением:

*** Terminating app due to uncaught exception 'CALayerInvalidGeometry', 
reason: 'CALayer position contains NaN: [nan nan].
2 голосов
/ 03 июля 2019

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

ScrollView {
    VStack {
        Text(longText)
            .lineLimit(nil)
            .font(.largeTitle)
            .frame(idealHeight: .infinity)
    }
}
1 голос
/ 21 июня 2019

Кажется, что в 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)
       }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...