Даже после установки .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))
}
Кажется, SwiftUI не хочет, чтобы у вас был текст .font(.title) на нескольких строках.





Похоже, что font содержит атрибуты переноса строк.
Если вы измените его на body, то он переносится правильно!
Хорошо, вы поняли, но это, безусловно, означает, что шрифт заголовка типа не может быть обернут?
@Let's_Create никто точно не знает, так как это не открытый исходный код, и мы действительно не знаем, что происходит под капотом. Это просто предположение.
@ Let's_Create они используют шрифты заголовков для заголовков навигации, поэтому имеет смысл не переносить их - с точки зрения дизайна.
Да тогда есть смысл
Попробуйте изменить 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 Тип текста здесь ведет себя странно! Например, если вы поменяете местами два текста, у которых есть lineLimit (nil), он будет работать, как и ожидалось. Или, если вы удалите шрифт заголовка, он снова заработает. Я действительно не уверен в этом поведении, так как он все еще находится в стадии бета-тестирования.
Это не работает для меня в бета-версии 2. Единственный способ заставить это работать — добавить .lineLimit(3) в VStack (что заставляет его применяться ко всем дочерним элементам). Кажется, что .lineLimit(nil) просто не имеет никакого эффекта, и lineLimit нужно добавлять к родителю, а не напрямую к представлениям Text
@BenjaminKindle Спасибо за обходной путь. Обычно он должен работать с обоими lineLimit(nil), но на бета-фазе он работает очень нестабильно, и изменение шрифта также исправляет это!
Я попробовал это и установил для обоих значение 99999, но не вижу никаких изменений.
Установка lineLimit(nil) не помогла. Вместо этого это сработало: .fixedSize(horizontal: false, vertical: true)
lineLimit похоже, что он связан только с количеством строк на основе подсчета встроенных новых строк. Многострочный текст с новыми строками приводит к тому, что соответствующее количество строк используется для представления текста. Как только это будет установлено, если вы измените размер графического интерфейса (например, на Mac), вы увидите, что текст переносится. Но общие строки вида не меняются.
Используя .fixedSize(horizontal: false, vertical: true), я смог динамически изменить размер текста на несколько строк (учитывая одну длинную строку в качестве строки), но родительское представление по-прежнему предполагало, что это одна строка. Таким образом, текстовое представление расширилось за пределы выделенного ему пространства и обрезалось по краям. Пока что кажется, что в Xcode 11.4.1 он постоянно ломается. Насколько я вижу, перенос строк никак не влияет на окружающую геометрию.
Упс. Теперь я думаю, что моя проблема могла заключаться в том, что мой текст находился внутри списка. Если я делаю то же самое в пустом приложении, оно работает по-другому.
Как оказалось, мне не нужен был вызов fixedSize. Как только я переместил свой текст из представления «Список» и вместо этого ввел HStack, он начал динамически изменять свой размер так, как я хотел. Обычно я хотел бы удалить все свои комментарии выше, за исключением того, что я думаю, что важно отметить, что документы для lineLimit() на самом деле мало что объясняют. Количество строк в некоторых случаях кажется продиктованным количеством новых строк в строке, даже если строки переносятся.
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()
@JaronGao Это также должно работать с Spacer(), если я неправильно истолковываю то, что вы говорите. В любом случае, я рад, что смог помочь!
О, я имел в виду, что это решение работало независимо после попытки исправления lineLimit и исправления «удалить Spacer ()».
Ни одно из других решений не сработало для меня, но это сработало для меня. Спасибо! :)
Что особенно странно в этом решении, так это то, что в моем случае тексту даже НЕ НУЖНО оборачиваться. Перед добавлением этого текст был обрезан, после он отображается нормально на одной строке ?
Остерегайтесь, однако, что «это может привести к тому, что представление превысит границы родителя, что может быть или не быть желаемым эффектом».
Отличный совет, который решил мою проблему в сложном представлении с GeometryReader и VStack с искусственной шириной рамки в 3 раза больше исходной ширины. Но что интересно использую два раза falsefixedSize(horizontal: false, vertical: false) и работает... не понимаю fixedSize кажется.
В macOS этот модификатор изменяет размер окна. Окно после этого даже не помещается на экране :0
Это также решило проблему для меня, тогда как linelimit не повлияло ни на текстовое представление, ни на родительское представление.
Это должен быть правильный ответ! Работает как шарм!
У меня была ситуация с 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 НЕ выполнять свою пользовательскую логику изменения размера по горизонтали НЕ эллипсизации, что заставляет его следовать стандартным правилам, к которым мы все привыкли.
Спасибо им обоим!
Эй, спасибо за дополнительную информацию. Я чувствую, что моего ответа не хватает, так что это хороший дополнительный ответ. Спасибо еще раз!
Для моей проблемы у меня была такая настройка:
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()
}

По какой-то причине все, что мне нужно было сделать, это добавить 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()
}

я только что добавил
.padding()
к моему Text экземпляру, и это сработало
Удалите шрифт и цвет, затем попробуйте прямую линию, тогда это сработает или нет >?