我想在圓角矩形背景上生成帶有各種文本的氣泡狀視圖,大小適合文本。我已經到了:
var body: some View {
HStack {
Spacer()
ZStack(alignment: .trailing) {
Color.blue
VStack{
Text(message.content)
.padding(.all, .oneUnit)
.multilineTextAlignment(.trailing)
}
}
.clipShape(RoundedRectangle(cornerRadius: 12))
}
}
當使用 aForEach和一些作為訊息傳遞的文本重復此操作時,內容幾乎是正確的,但ZStack背景應該只大到足以覆寫文本,形成一個氣泡:

使用.layoutPriority修復此問題,代碼變為:
var body: some View {
HStack {
Spacer()
ZStack(alignment: .trailing) {
Color.blue
VStack{
Text(message.content)
.padding(.all, .oneUnit)
.multilineTextAlignment(.trailing)
}
.layoutPriority(1)
}
.clipShape(RoundedRectangle(cornerRadius: 12))
}
}

因此,大小ZStack是適合文本所需的大小。偉大的!現在將所有需要的文本放入VStack. 讓我們再添加一個Text:
var body: some View {
HStack {
Spacer()
ZStack(alignment: .trailing) {
Color.blue
VStack{
Text(message.content)
.padding(.all, .oneUnit)
.multilineTextAlignment(.trailing)
Text("Out damned spot!")
}
.layoutPriority(1)
}
.clipShape(RoundedRectangle(cornerRadius: 12))
}
}
下面的文字顯示,大小仍然正確。

但是最后一段文本必須右對齊。那么代碼是:
var body: some View {
HStack {
Spacer()
ZStack(alignment: .trailing) {
Color.blue
VStack{
Text(message.content)
.padding(.all, .oneUnit)
.multilineTextAlignment(.trailing)
HStack {
Spacer()
Text("Out damned spot!")
}
}
.layoutPriority(1)
}
.clipShape(RoundedRectangle(cornerRadius: 12))
}
}
然后一切都被打破了。誰能說出為什么會HStack破壞ZStack's 的大小?

uj5u.com熱心網友回復:
@SwissMark是對的,問題的原因Spacer()是貪婪,它占用了所有剩余空間。使您的氣泡盡可能大。但僅進行VStack對齊.trailing并不能解決問題。
問題:
- 您的背景設定在
ZStack - layoutPriority 在這里沒有任何意義
這是解決方案:
import SwiftUI
struct ContentView: View {
var messages = [
"I heard the owl scream and the crickets cry.",
"Out damned spot!",
"Did not you speak?",
"Out damned spot!",
"When?",
"Out damned spot!",
"Now.",
"Out damned spot!"
]
var body: some View {
HStack {
Spacer()
ZStack(alignment: .trailing) {
VStack(alignment: .trailing) {
VStack(alignment: .trailing) {
Text(messages[0])
.padding(.all, 4)
.multilineTextAlignment(.trailing)
Text(messages[1])
.padding([.bottom, .trailing], 4)
}
.padding(4)
.background(Color.blue)
.clipShape(RoundedRectangle(cornerRadius: 12))
VStack(alignment: .trailing) {
Text(messages[2])
.padding(.all, 4)
.multilineTextAlignment(.trailing)
Text(messages[3])
.padding([.bottom, .trailing], 4)
}
.padding(4)
.background(Color.blue)
.clipShape(RoundedRectangle(cornerRadius: 12))
VStack(alignment: .trailing) {
Text(messages[4])
.padding(.all, 4)
.multilineTextAlignment(.trailing)
Text(messages[5])
.padding([.bottom, .trailing], 4)
}
.padding(4)
.background(Color.blue)
.clipShape(RoundedRectangle(cornerRadius: 12))
VStack(alignment: .trailing) {
Text(messages[6])
.padding(.all, 4)
.multilineTextAlignment(.trailing)
Text(messages[7])
.padding([.bottom, .trailing], 4)
}
.padding(4)
.background(Color.blue)
.clipShape(RoundedRectangle(cornerRadius: 12))
}
}
}
}
}
最終影像:

根據需要修改填充和空格。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/531435.html
