Текст не заворачивается в быстрый пользовательский интерфейс

Даже после установки .lineLimit(nil) текст не переносится.

var body: some View {
    VStack(alignment: .center) {
        Text("SwiftUI is a modern way to declare user interfaces for any Apple platform. ")
            .font(.title)
            .color(.red)
            .lineLimit(nil)
        Text("Create beautiful, dynamic apps faster than ever before.")
            .font(.system(size: 20))
            .lineLimit(nil)
    }.padding(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10))
}

Текст не заворачивается в быстрый пользовательский интерфейс

Удалите шрифт и цвет, затем попробуйте прямую линию, тогда это сработает или нет >?

Yogesh Patel 08.06.2019 13:34

Кажется, SwiftUI не хочет, чтобы у вас был текст .font(.title) на нескольких строках.

rraphael 08.06.2019 13:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
80
2
35 184
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Похоже, что font содержит атрибуты переноса строк.

Если вы измените его на body, то он переносится правильно!

Хорошо, вы поняли, но это, безусловно, означает, что шрифт заголовка типа не может быть обернут?

Let's_Create 08.06.2019 13:40

@Let's_Create никто точно не знает, так как это не открытый исходный код, и мы действительно не знаем, что происходит под капотом. Это просто предположение.

Matteo Pacini 08.06.2019 13:41

@ Let's_Create они используют шрифты заголовков для заголовков навигации, поэтому имеет смысл не переносить их - с точки зрения дизайна.

Matteo Pacini 08.06.2019 13:43

Да тогда есть смысл

Let's_Create 08.06.2019 13:45
Ответ принят как подходящий

Попробуйте изменить lineLimit второго текста на число вместо нуля:

VStack(alignment: .leading) {
  Text("SwiftUI is a modern way to declare user interfaces for any Apple platform. ")
    .font(.title)
    .color(.red)
    .lineLimit(nil)
  Text("Create beautiful, dynamic apps faster than ever before.")
    .font(.system(size: 20))
    .lineLimit(2)
 }.padding(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10))

Результат:

Это, конечно, работает, но как удалось достичь этого решения.

Let's_Create 08.06.2019 13:51

@Let's_Create Тип текста здесь ведет себя странно! Например, если вы поменяете местами два текста, у которых есть lineLimit (nil), он будет работать, как и ожидалось. Или, если вы удалите шрифт заголовка, он снова заработает. Я действительно не уверен в этом поведении, так как он все еще находится в стадии бета-тестирования.

M Reza 08.06.2019 14:31

Это не работает для меня в бета-версии 2. Единственный способ заставить это работать — добавить .lineLimit(3) в VStack (что заставляет его применяться ко всем дочерним элементам). Кажется, что .lineLimit(nil) просто не имеет никакого эффекта, и lineLimit нужно добавлять к родителю, а не напрямую к представлениям Text

Benjamin Kindle 22.06.2019 17:57

@BenjaminKindle Спасибо за обходной путь. Обычно он должен работать с обоими lineLimit(nil), но на бета-фазе он работает очень нестабильно, и изменение шрифта также исправляет это!

M Reza 22.06.2019 18:13

Я попробовал это и установил для обоих значение 99999, но не вижу никаких изменений.

Ky. 07.02.2020 00:56

Установка lineLimit(nil) не помогла. Вместо этого это сработало: .fixedSize(horizontal: false, vertical: true)

P. Ent 22.04.2020 18:51

lineLimit похоже, что он связан только с количеством строк на основе подсчета встроенных новых строк. Многострочный текст с новыми строками приводит к тому, что соответствующее количество строк используется для представления текста. Как только это будет установлено, если вы измените размер графического интерфейса (например, на Mac), вы увидите, что текст переносится. Но общие строки вида не меняются.

Chris Quenelle 17.05.2020 05:14

Используя .fixedSize(horizontal: false, vertical: true), я смог динамически изменить размер текста на несколько строк (учитывая одну длинную строку в качестве строки), но родительское представление по-прежнему предполагало, что это одна строка. Таким образом, текстовое представление расширилось за пределы выделенного ему пространства и обрезалось по краям. Пока что кажется, что в Xcode 11.4.1 он постоянно ломается. Насколько я вижу, перенос строк никак не влияет на окружающую геометрию.

Chris Quenelle 17.05.2020 05:24

Упс. Теперь я думаю, что моя проблема могла заключаться в том, что мой текст находился внутри списка. Если я делаю то же самое в пустом приложении, оно работает по-другому.

Chris Quenelle 17.05.2020 05:33

Как оказалось, мне не нужен был вызов fixedSize. Как только я переместил свой текст из представления «Список» и вместо этого ввел HStack, он начал динамически изменять свой размер так, как я хотел. Обычно я хотел бы удалить все свои комментарии выше, за исключением того, что я думаю, что важно отметить, что документы для lineLimit() на самом деле мало что объясняют. Количество строк в некоторых случаях кажется продиктованным количеством новых строк в строке, даже если строки переносятся.

Chris Quenelle 17.05.2020 06:05

SwiftUI

.lineLimit(nil) VS .lineLimit(any number)

VStack(alignment: .leading, spacing: 16.0) {
// Sets the maximum number of lines that text can occupy in the view.

      Text("SwiftUI is a user interface toolkit that lets us design apps in a declarative way. ")
      .font(.title)
      .lineLimit(3)

// But if you don't know about the the text size then Sets nil in the lineLimit.

      Text("SwiftUI is a user interface toolkit that lets us design apps in a declarative way. That's a fancy way of saying that we tell SwiftUI how we want our UI to look and work, and it figures out how to make that happen as the user interacts with it.... ")
       .font(.body)
       .lineLimit(nil)
}.padding(EdgeInsets(top: 0, leading: 8, bottom: 0, trailing: 8))

Проведя много времени с такой ошибкой, я не могу быть на 100% уверен, что это проблема с ограничением строки. На момент написания этого поста решение, которое я нашел для более сложных представлений, — это следующий фрагмент кода для предотвращения переноса:

.fixedSize(horizontal: false, vertical: true)

Это должно предотвратить свертывание текста интерпретатором по вертикали.

Я надеюсь, что это поможет кому-то.

Это решение устранило мою проблему после попытки lineLimit и удаления Spacer()

Jaron Gao 12.12.2019 16:02

@JaronGao Это также должно работать с Spacer(), если я неправильно истолковываю то, что вы говорите. В любом случае, я рад, что смог помочь!

Sharpienero 13.12.2019 18:39

О, я имел в виду, что это решение работало независимо после попытки исправления lineLimit и исправления «удалить Spacer ()».

Jaron Gao 13.12.2019 21:36

Ни одно из других решений не сработало для меня, но это сработало для меня. Спасибо! :)

Luke Chambers 14.12.2019 02:21

Что особенно странно в этом решении, так это то, что в моем случае тексту даже НЕ НУЖНО оборачиваться. Перед добавлением этого текст был обрезан, после он отображается нормально на одной строке ?

lewis 28.09.2020 16:48

Остерегайтесь, однако, что «это может привести к тому, что представление превысит границы родителя, что может быть или не быть желаемым эффектом».

Zsolt 26.11.2020 13:31

Отличный совет, который решил мою проблему в сложном представлении с GeometryReader и VStack с искусственной шириной рамки в 3 раза больше исходной ширины. Но что интересно использую два раза falsefixedSize(horizontal: false, vertical: false) и работает... не понимаю fixedSize кажется.

pd95 30.11.2020 15:07

В macOS этот модификатор изменяет размер окна. Окно после этого даже не помещается на экране :0

Vlad 21.03.2021 18:35

Это также решило проблему для меня, тогда как linelimit не повлияло ни на текстовое представление, ни на родительское представление.

Indiana 29.07.2021 12:16

Это должен быть правильный ответ! Работает как шарм!

SchmidtFx 08.02.2022 11:15

У меня была ситуация с UIViewRepresentableобернутым UITextField, которая была представлена ​​как:

VStack {
    Text("Long enough to wrap....")
    Spacer().frame(height: 40)
    CustomTextField()
}

Text перестал переноситься, когда я добавил CustomTextField. Ничего из того, что я делал с Text, не помогло. Если я уберу Spacer(), все будет отлично!!

В итоге я удалил Spacer и добавил нижний отступ к Text. Насколько я могу судить, мой CustomTextField в порядке, и я не понимаю, почему это может повлиять на алгоритмы компоновки SwiftUI.

Полное решение для Xcode 11.3/Swift 5.1 можно найти здесь в нескольких ответах.

Объяснение того, почему это происходит, можно найти в Ответ Маттео Пачини: использование предопределенных .font(.title), .font(.headline) и т. д., по-видимому, приводит к тому, что эти Text представления всегда будут иметь размер эллипса, а не перенос. Однако простое переключение на .body не кажется лучшим решением.

Лучший обходной путь находится в Ответ Шарпиенеро: добавьте .fixedSize(horizontal: false, vertical: true) к вашему Text представлению. Это говорит представлению Text НЕ выполнять свою пользовательскую логику изменения размера по горизонтали НЕ эллипсизации, что заставляет его следовать стандартным правилам, к которым мы все привыкли.

Спасибо им обоим!

Эй, спасибо за дополнительную информацию. Я чувствую, что моего ответа не хватает, так что это хороший дополнительный ответ. Спасибо еще раз!

Sharpienero 12.02.2020 20:09

Для моей проблемы у меня была такая настройка:

public var body: some View {
    Form {
        Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
            .font(.title)

        Spacer()
            .fixedSize()

        Text("""
            Integer ut orci odio. Proin cursus ut elit eget rutrum. Nunc ante sem, euismod sed purus sed, tempus elementum elit. Phasellus lobortis at arcu quis porta. Cras accumsan leo eu tempus molestie. Suspendisse vulputate diam ipsum, et tristique lorem porta et. Pellentesque sodales est id arcu luctus venenatis.

            Vestibulum non magna lorem. In tincidunt aliquet nunc, sit amet pharetra neque hendrerit id.

            Cras sed!
            """)

        NativeButton("OK", keyEquivalent: .return) { self.screen = .game }
    }
        .frame(maxWidth: 480)
        .fixedSize()
        .padding()
}

Only the first line of the first `Text` and the first few lines of the second `Text` appear

По какой-то причине все, что мне нужно было сделать, это добавить minWidth: 480, idealWidth: 480 к кадру, и все отрендерилось правильно. Я не ожидал этого, потому что я уже подал заявку .fixedSize(), поэтому я подумал, что одного из этих трех должно быть достаточно.

public var body: some View {
    Form {
        Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
            .font(.title)

        Spacer()
            .fixedSize()

        Text("""
            Integer ut orci odio. Proin cursus ut elit eget rutrum. Nunc ante sem, euismod sed purus sed, tempus elementum elit. Phasellus lobortis at arcu quis porta. Cras accumsan leo eu tempus molestie. Suspendisse vulputate diam ipsum, et tristique lorem porta et. Pellentesque sodales est id arcu luctus venenatis.

            Vestibulum non magna lorem. In tincidunt aliquet nunc, sit amet pharetra neque hendrerit id.

            Cras sed!
            """)

        NativeButton("OK", keyEquivalent: .return) { self.screen = .game }
    }
        .frame(minWidth: 480, idealWidth: 480, maxWidth: 480)
        .fixedSize()
        .padding()
}

All the text appears as intended

я только что добавил

.padding()

к моему Text экземпляру, и это сработало

Другие вопросы по теме