我正在使用SwiftUI创建小部件,而我在Swift中却非常简单明了。
我有2张彼此相邻的图像,我希望它们的尺寸完全相同,并具有宽高比填充,但又不要超出范围。
目前它是如何工作的,我有一个视图,即图像和文本。然后是具有包含两个视图的HStack的父视图。
基本上我想要实现的是此视图,但是图像正确:
这是这样做的:
VStack() {
Image(uiImage: image)
.resizable()
Text(affirmation.title)
.font(.body)
.foregroundColor(Color(UIColor.MAPurple()))
}
}
对于父视图:
HStack {
Spacer()
CardView(text: text, image: firstImage)
Spacer()
CardView(text: text, image: secondImage)
Spacer()
}
如果像我在Swift中那样添加长宽比来填充,则外观如下:
更新
添加一个最小的可复制示例:
struct CardView: View {
let text: String
let image: UIImage
var body: some View {
VStack(alignment: .leading) {
Image(uiImage: image)
.resizable()
// .aspectRatio(contentMode: .fill)
.clipped()
Text(text)
.font(.body)
.multilineTextAlignment(.leading)
.foregroundColor(Color.blue)
}
}
}
struct ParentView: View {
let firstText: String = "This is something"
let firstImage: UIImage
let secondText: String = "This is something else"
let secondImage: UIImage
let top: String = "This is the top string"
var body: some View {
VStack {
Spacer()
Spacer()
Text(top)
.font(.largeTitle)
.foregroundColor(Color(UIColor.MAPurple()))
.padding(.all, 10)
.minimumScaleFactor(0.4)
Spacer()
Spacer()
HStack {
Spacer()
CardView(text: firstText, image: firstImage)
Spacer()
CardView(text: secondText, image: secondImage)
Spacer()
}
Spacer()
Spacer()
}
.background(Color.yellow)
.edgesIgnoringSafeArea(.all)
}
}
答案 0 :(得分:0)
为图像提供适当的高度即可解决问题。
分开的水平图像视图和文本视图。由于文字的高度可能会根据内容而增加,但是图像应正确对齐。给定Text
的最大宽度,因为它不能超过Image
的宽度。
CardTextView
将图像中HStack
中的两个文本对齐
struct CardTextView: View {
let text: String
var body: some View {
return Text(text)
.font(.body)
.multilineTextAlignment(.leading)
.lineLimit(nil)
.foregroundColor(Color.blue)
.frame(minWidth: 0, maxWidth:170)
}
}
CardImageView
将主标题下方的HStack
中的两个图像对齐
struct CardImageView: View {
let image: UIImage
var body: some View {
return Image(uiImage: image)
.resizable()
.frame(width:170, height: 170)
.cornerRadius(12)
}
}
最后
ParentView
:为VStack
和HStack
都增加了间距
struct ParentView: View {
let firstText: String = "This is something"
let firstImage: UIImage
let secondText: String = "This is something else a looonnnnnggggg texttttttttttt"
let secondImage: UIImage
let top: String = "This is the top string"
var body: some View {
VStack(spacing: 12) {
Text(top)
.font(.title)
.foregroundColor(Color(UIColor.purple))
.padding(.top, 20)
HStack(spacing: 12) {
CardImageView(image: firstImage)
CardImageView(image: secondImage)
}
HStack(spacing: 12) {
CardTextView(text: firstText)
CardTextView(text: secondText)
}.padding(.bottom, 20)
}.padding(16)
.background(Color.yellow).cornerRadius(14)
}
}
我想这就是您的期望。