Как я могу получить текст для переноса в UILabel (через UIViewRepresentable), не имея фиксированной ширины? - PullRequest
0 голосов
/ 20 октября 2019

Установка lineBreakMode в byWordWrapping и установка numberOfLines в 0 кажется недостаточной:

struct MyTextView: UIViewRepresentable {
    func makeUIView(context: Context) -> UILabel {
        let label = UILabel()
        label.lineBreakMode = .byWordWrapping
        label.numberOfLines = 0
        label.text = "Here's a lot of text for you to display. It won't fit on the screen."
        return label
    }

    func updateUIView(_ view: UILabel, context: Context) {
    }
}

struct MyTextView_Previews: PreviewProvider {
    static var previews: some View {
        MyTextView()
            .previewLayout(.fixed(width: 300, height: 200))
    }
}

Текст не переносится, независимо от того, какой параметр я использую для lineBreakMode. Предварительный просмотр холста и предварительный просмотр в реальном времени выглядят так:

Screenshot of the text not wrapping

Самое близкое, что я получил, - это установление предпочитаемого значения MaxLayoutWidth, которое приводит к переносу текста,но, похоже, не существует значения, которое означает «какого бы размера не было представление».

1 Ответ

1 голос
/ 20 октября 2019

Возможное решение - объявить ширину как переменную в MyTextView:

struct MyTextView: UIViewRepresentable {

    var width: CGFloat

    func makeUIView(context: Context) -> UILabel {
        let label = UILabel()
        label.lineBreakMode = .byWordWrapping
        label.numberOfLines = 0
        label.preferredMaxLayoutWidth = width
        label.text = "Here's a lot of text for you to display. It won't fit on the screen."
        return label
    }

    func updateUIView(_ view: UILabel, context: Context) {
    }
}

, а затем использовать GeometryReader, чтобы выяснить, сколько места доступно, и передать его в инициализатор:

struct ExampleView: View {

    var body: some View {
        GeometryReader { geometry in
            MyTextView(width: geometry.size.width)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...