In Xcode Beta 3 :
Если у вас есть одно представление Text
в стеке, вложенном в представление прокрутки, использует обходной путь frame(idealHeight: .infinity)
:
ScrollView {
VStack {
Text(someString)
.lineLimit(nil)
.frame(idealHeight: .infinity)
}
}
Если имеется несколько многострочных текстов, удалите .frame
из более поздних представлений:
Если в стеке несколько элементов Text
, иприменив frame(idealHeight: .infinity)
к нескольким, вы обнаружите сбои SwiftUI в коде макета стека по адресу: StackLayout.Header.init(layoutContext:proxies:majorAxis:minorAxisAlignment:uniformSpacing:childStorage:capacity:)
.
Чтобы обойти это, примените только idealHeight
к первому Text
представлению.По крайней мере, в бета-версии 3 это имеет побочный эффект, заключающийся в переносе более поздних Text
представлений.
ScrollView {
VStack {
Text(someString)
.lineLimit(nil)
.frame(idealHeight: .infinity) // Only to the first!
Text(anotherLongString)
.lineLimit(nil)
}
}
Если содержимое вашего стека является динамическим, используйте этот прием:
Один пустой Text("")
вид сверху с frame(idealHeight: .infinity)
будет иметь побочный эффект от переноса более поздних текстовых узлов.
ScrollView {
VStack {
// Place a single empty / "" at the top of your stack.
// It will consume no vertical space.
Text("")
.lineLimit(nil)
.frame(idealHeight: .infinity)
ForEach(someArray) { someString in
// Omit the `idealHeight: .infinity` trick from
// all the later Text views.
Text(someString)
.lineLimit(nil)
}
}
}
Предупреждение:
.frame(idealHeight: .infinity)
не работает, если у вас в стеке Spacer()
.
Сбой следующего:
ScrollView {
VStack {
Text(someString)
.lineLimit(nil)
.frame(idealHeight: .infinity)
Spacer()
}
}
... за исключением:
*** Terminating app due to uncaught exception 'CALayerInvalidGeometry',
reason: 'CALayer position contains NaN: [nan nan].