Текст SwiftUI не будет расширяться на несколько строк

Я только начал использовать SwiftUI с розничной сборкой. Я не могу заставить одно из моих текстовых представлений автоматически расширяться на несколько строк. Я прочитал много тем о SO и HackingWithSwift, но не могу заставить его работать. Я думаю, возможно, это может быть связано с другими моими кадрами, но я не уверен, с чего начать.

struct Message: View {
    var body: some View {
        ZStack() {
            Color.blue.cornerRadius(8)
            VStack(alignment: .leading, spacing: 8) {
                Text("Lorem Ipsum")
                    .foregroundColor(.white)
                    .bold()
                    .font(.system(size: 20))
                Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Donec enim diam vulputate ut pharetra. Sed turpis tincidunt id aliquet risus feugiat in. Interdum velit laoreet id donec ultrices tincidunt arcu non.  Lorem END")
                    .foregroundColor(.white)
                    .lineLimit(nil)
                Text("Sent to Group1 by iShaymus")
                    .foregroundColor(.white)
                    .italic()
                    .opacity(0.5)
                    .font(.system(size: 12))
            }
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading)
            .padding(12)
        }
    }
}

Я пытался применить кадры к Text(). Я пытался добавить .font(.body). Я пытался установить .lineLimit(100). Ни один из них не работал. Вывод всегда следующий:

Снимок экрана iOS

Вся строка тела заметно длиннее:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Donec enim diam vulputate ut pharetra. Sed turpis tincidunt id aliquet risus feugiat in. Interdum velit laoreet id donec ultrices tincidunt arcu non.  Lorem END

Это рабочий код благодаря Марку

import SwiftUI

struct Message: View {

    @State var title = ""
    @State var messageBody = ""
    @State var sentBy = ""
    @State var targetSite = ""

    var body: some View {
        VStack(alignment: .leading, spacing: 8) {
            Text(title)
                .foregroundColor(.white)
                .bold()
                .font(.system(size: 20))
            Text(messageBody)
                .foregroundColor(.white)
                .fixedSize(horizontal: false, vertical: true)
            Text("Sent to \(targetSite) by \(sentBy)")
                .foregroundColor(.white)
                .italic()
                .opacity(0.5)
                .font(.system(size: 12))
            }
            .frame(minWidth: 0, maxWidth: .infinity, alignment: .topLeading)
            .padding(12)
            .background(Color.blue)
            .cornerRadius(10)
    }
}

person iShaymus    schedule 21.09.2019    source источник
comment
Что произойдет, если вы переместите lineLimit выше foregroundColor?   -  person EmilioPelaez    schedule 22.09.2019
comment
@EmilioPelaez тот же результат :-(   -  person iShaymus    schedule 22.09.2019
comment
Привет, это все еще работает? Потому что это не для меня в 13.4 и Swift5.2. Вы что-то изменили за это время? Спасибо.   -  person Lord Anubis    schedule 07.05.2020


Ответы (2)


Я думаю, это то, что вы ищете. Используйте .fixedSize(horizontal: false, vertical: true) по мере необходимости.

struct Message: View {
    var body: some View {
        ZStack() {
            Color.blue.cornerRadius(8)
            VStack(alignment: .leading, spacing: 8) {
                Text("Lorem Ipsum")
                    .foregroundColor(.white)
                    .bold()
                    .font(.system(size: 20))
                Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Donec enim diam vulputate ut pharetra. Sed turpis tincidunt id aliquet risus feugiat in. Interdum velit laoreet id donec ultrices tincidunt arcu non.  Lorem END")
                    .foregroundColor(.white)
                      .fixedSize(horizontal: false, vertical: true)
                Text("Sent to Group1 by iShaymus")
                    .foregroundColor(.white)
                    .italic()
                    .opacity(0.5)
                    .font(.system(size: 12))
            }
         //   .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading)
            .padding(12)
        }
          .fixedSize(horizontal: false, vertical: true)
    }
}
person Marc T.    schedule 22.09.2019
comment
На самом деле это лучший ответ, так как .layoutPriority(1) вызывает у меня проблемы с интервалами. - person iShaymus; 22.09.2019

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

Используйте этот модификатор, чтобы отдать приоритет интервалам при компоновке представлений.

Пример

(Выдержка из книги просмотров SwiftUI) Выдержка из книги представлений SwiftUI

Код

Взгляните на комментарии в этом коде:

struct LayoutPriority_Intro: View {
    var body: some View {
        VStack(spacing: 20) {
            Text("Layout Priority").font(.largeTitle)
            Text("Introduction").foregroundColor(.gray)
            Text("Use layout priority to tell the parent which child views get priority when it comes to assigning layout space.")
                .layoutPriority(1) // Second highest priority
                .frame(maxWidth: .infinity)
                .padding()
                .background(Color.yellow)
                .foregroundColor(.black)
            
            Text("No layout priority (default is 0)")
            VStack(alignment: .leading, spacing: 8) {
                HStack {
                    Image("profile2").mask(Circle())
                    Text("Janice Okoro").font(.largeTitle)
                }
                Text("Lorem ipsum dolor amet laborum gastropub laboris magna.")
                    .font(.body)
            }
            .padding()
            .foregroundColor(.black)
            .background(Color.yellow.cornerRadius(8))
            .padding(.horizontal)
            
            Text("Layout priority used")
            VStack(alignment: .leading, spacing: 8) {
                HStack {
                    Image("profile2").mask(Circle())
                    Text("Janice Okoro").font(.largeTitle)
                }
                Text("Lorem ipsum dolor amet laborum gastropub laboris magna.")
                    .font(.body)
            }
                // Give this view spacing priority over the other child views
                .layoutPriority(2) // Highest priority
                .padding()
                .foregroundColor(.black)
                .background(Color.yellow.cornerRadius(8))
                .padding(.horizontal)
        }
        .font(.title)
        .edgesIgnoringSafeArea(.bottom)
    }
}

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

Если это не поможет, установите приоритет макета в VStack.

person Mark Moeykens    schedule 22.09.2019
comment
Чтобы соответствовать снимку экрана, у меня просто ContentView.swift вызывает Message() три раза в List { } - person iShaymus; 22.09.2019
comment
Работало при применении к Text(). Следует отметить, что если для VStack установлены какие-либо свойства высоты, он перестает работать. - person iShaymus; 22.09.2019