Текст в VStack сокращается

#ios #swift #swiftui

Вопрос:

У меня есть представление, аналогичное приведенному ниже коду. По какой-то причине мой длинный текст сокращается, хотя этого не должно быть. Почему это так?

 struct ContentView: View {
    var body: some View {
        VStack {
            ScrollView {
                VStack(alignment: .leading, spacing: 32) {
                    HStack(alignment: .top, spacing: 8) {
                        Image(systemName: "hand.raised.fill")
                            .resizable()
                            .frame(width: 50, height: 50)
                        VStack(alignment: .leading) {
                            Text(shortText)
                            Text(longDescription)
                                .lineSpacing(4)
                                // this is being condensed
                        }
                    }
                }
                .padding([.leading, .trailing])
            }
        }
        VStack {
            // Custom Button goes here
            Spacer()
        }
        .frame(height: 70)
    }
}
 

Комментарии:

1. Хорошо, я просто исправил это после публикации, добавив .layoutPriority(1) к длинному тексту. Кто-нибудь может объяснить, зачем ему это понадобилось?

2. Я не смог воспроизвести его, как на iOS 14, так и на iOS 15 я вижу полный текст с вашим кодом

3. @Tometoyou: Я пробовал ваши коды, в которых нет необходимости .layoutPriority(1) , или .lineSpacing(4) все были хороши без проблем! xCode: Версия 12.5.1 (12E507) PS: Также не забывайте использовать .scaledToFit() после .resizable() для изображения!

4. Вы пробовали это с длинным отрывком текста? Он отсекает дефо. И для этого нужны пробелы.

5. Да! Я пробовал даже с длинным!

Ответ №1:

.layoutPriority(1) говорит системе компоновки, что она должна отдавать приоритет желаемым размерам этого вида по сравнению с чем-либо с более низким приоритетом, чтобы он не уплотнялся.

Причина, по которой вы Text сгущаетесь, заключается в том, что он находится в ScrollView .

В контексте без прокрутки система компоновки позволяет видам расширяться, используя доступное пространство (т. е. Размер экрана) в качестве ограничения.

В контексте прокрутки нет ограничений на доступное пространство, поэтому разрешение представлениям расширяться до максимального размера может привести к тому, что некоторые представления будут иметь бесконечный размер ( Color.red например, будут пытаться занять как можно больше места).

Вот почему ваш Text вид сжат до минимального пространства, которое он поддерживает (высота одной строки), в отличие от максимального размера, который он поддерживает.

пс. Может существовать комбинация модификаторов, которая не layoutPriority(1) позволяет Text указывать минимальный размер как необходимый размер для отображения всего содержимого. Если у меня будет время попытаться найти его, я обновлю этот ответ.

Комментарии:

1. Но что на самом деле заставляет его конденсироваться?

2. @Tometoyou добавил более подробную информацию к моему ответу

3. Ладно, на самом деле это не сводится к одной строке, а к трем строкам высотой. Я думаю, что это имеет смысл, хотя