目标是让UILabel
集成过孔UIViewRepresentable
以相同的方式调整大小Text
- 使用可用宽度并换行以适应所有文本,从而增加HStack
其所在的高度,而不是无限扩大宽度。这与这个问题非常相似,尽管接受的答案不适用于我使用的涉及 a ScrollView
、VStack
和的布局HStack
。
struct ContentView: View {
var body: some View {
ScrollView {
VStack {
HStack {
Text("Hello, World")
Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tempor justo quam, quis suscipit leo sollicitudin vel.")
//LabelView(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tempor justo quam, quis suscipit leo sollicitudin vel.")
}
HStack {
Text("Hello, World")
Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tempor justo quam, quis suscipit leo sollicitudin vel.")
}
Spacer()
}
}
}
}
struct LabelView: UIViewRepresentable {
var text: String
func makeUIView(context: UIViewRepresentableContext<LabelView>) -> UILabel {
let label = UILabel()
label.text = text
label.numberOfLines = 0
return label
}
func updateUIView(_ uiView: UILabel, context: UIViewRepresentableContext<LabelView>) {
uiView.text = text
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
在 HStack 中使用两个 Text 会产生这种所需的布局:
使用 Text 和 LabelView 会导致这种不受欢迎的布局:
如果您将 in 包装起来LabelView
并GeometryReader
传递 a width
intoLabelView
来设置preferredMaxLayoutWidth
,这是0.0
出于某种原因。如果GeometryReader
将. ScrollView
_ LabelView
_HStack
相反,如果我指定label.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
它工作得更好,但仍然不显示所有文本,它奇怪地截断了LabelView
at 3 行,第二行截断了Text
2 行。