我们的目标是通过UIViewRepresentable
集成一个UILabel
,以与Text
相同的方式调整大小--使用可用的宽度并换行以适应所有文本,从而增加HStack
的高度,而不是无限地扩展宽度。这与this question非常相似,尽管这个公认的答案不适用于我使用的包含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和LabelView会导致此不需要的布局:
如果将LabelView
Package 到GeometryReader
中,并将width
传递到LabelView
以设置preferredMaxLayoutWidth
,由于某种原因,它将是0.0
。如果将GeometryReader
移到ScrollView
之外,可以获得宽度,但这样它将是滚动视图宽度。而不是SwiftUI为HStack
中的LabelView
建议的宽度。
如果我指定label.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
,效果会更好,但仍然不能显示所有文本,奇怪的是,它会在3行处截断LabelView
,在2行处截断第二个Text
。
4条答案
按热度按时间gg0vcinb1#
这里的问题出在
ScrollView
中,它需要明确的高度,但representable没有提供。可能的解决方案是动态计算换行文本高度并显式指定它。使用Xcode 12 / iOS 14进行测试
cigdeys32#
这不是一个具体的答案。
我意外地发现固定大小修饰符可以帮助自动调整UILabel的大小以适应其内容大小。
第一个
演示:
另外,如果你不想提供最大高度,你可以将
preferredMaxLayoutWidth
设置为你的屏幕宽度。如果你把它放在updateUIView方法中,每当屏幕方向改变时,这个方法也会被调用。为了完整起见,这是我用来测试视图的属性化文本设置。但是,它不应该影响视图大小调整的工作方式。
gj3fmq9x3#
问题出在标签的宽度限制上。不需要修改内容压缩阻力或其他标签设置。只需设置
preferredMaxLayoutWidth
值:用法:
您可以使用
GeometryReader
或UIScreen.main.bounds.width
来提供。但是底部有一些额外的填充。这就是为什么我使用了一些负的底部填充:sdnqo3pr4#
目前的答案中没有一个解决方案足够接近SwiftUI的本质,换一种思路,既然SwiftUI对Text足够好,为什么不做这样的事情呢?
简单地说,让Text告诉你标签的高度并作为标签的基础,毕竟Text是SwiftUI的儿子。