SwiftUI:ZStack with scaleEffect - 如何将缩放后的图像与底部对齐?
SwiftUI: ZStack with scaleEffect - how to align scaled image to bottom?
我有一个显示图像的 ZStack。
图片在某些情况下需要缩放。
我无法对齐 ZStack 底部的缩放图像,它总是显示在中间。
我尝试将 ZStack(alignment: .bottom) 与 .alignmentGuide(.bottom) 结合用于图像,但这并没有改变结果。
同时在图像周围放置一个 VStack 并在其上方放置一个 Spacer() 不会改变结果。
HStack 不相关,仅显示,因为我需要在此构造中使用 ZStack。但主要问题在于 VStack,在 ZStack 的 Space 中缩放后它不会移动。
好像.scaleEffect 只是使用原始图像的位置和框架并将缩放后的图像放在中间。这是 scaleEffect 的限制吗?还有什么功能可以使用?
This is my View (reduced code): // 我将背景涂成紫色,以显示 ZStack 的完整大小
var body: some View {
ZStack(alignment: .bottom) {
Color.purple
Image(battlingIndividual.getMonster().getStatusImageName(battlingIndividual.status))
.resizable()
.scaledToFill()
.scaleEffect(battlingIndividual.getMonster().size.scaleValue)
HStack() {
SkillViews(battlingIndividual: battlingIndividual)
Spacer()
}
}
}
结果是这样的:
但它应该是这样的:
编辑:我为图像添加了背景,以显示图像在 ZStack 中居中。
解法:
在这种情况下我们不需要对齐,我们需要一个锚点:
.scaleEffect(battlingIndividual.getMonster().size.scaleValue, anchor: .bottom)
解决方案图片:
请将您的图像放在 VStack 中,并在图像上方放置一个 Spacer(),您的图像将位于 Stack 的底部。对齐 .bottom 只是为了将多个视图彼此对齐,但您的 Stack 中没有多个视图。 HStack 不计入对齐。
如果我在我的示例中尝试这个并缩小图像,
import SwiftUI
struct ContentView: View {
var body: some View {
ZStack {
Color.purple
VStack {
Spacer()
Image(systemName: "ladybug")
.resizable()
.scaledToFit()
.frame(width: 100, height: 100, alignment:
HStack {
Image(systemName: "hare")
.resizable()
.frame(width: 50, height: 50)
Image(systemName: "hare")
.resizable()
.frame(width: 50, height: 50)
Image(systemName: "hare")
.resizable()
.frame(width: 50, height: 50)
Spacer()
}
}
}
}
}
我明白了。
亲切的问候,
MacUserT
我假设这个视图容器 ZStack
是一个单元格视图,所以你需要对齐的不是紧贴内容的 ZStack,而是包含那些怪物单元格的整个 HStack
,比如
HStack(alignment: .bottom) { // << here !!
ForEach ... {
MonsterCellView()
}
}
我明白了。
.scaleEffect 使用自己的anchor,可以设置为.bottom.
scaleEffect(_:anchor:) Apple Developer
因此我只需要将“ancor: .bottom”添加到 scaleEffect。
.scaleEffect(battlingIndividual.getMonster().size.scaleValue, anchor:
.bottom)
对于以下结果:
我有一个显示图像的 ZStack。 图片在某些情况下需要缩放。
我无法对齐 ZStack 底部的缩放图像,它总是显示在中间。
我尝试将 ZStack(alignment: .bottom) 与 .alignmentGuide(.bottom) 结合用于图像,但这并没有改变结果。
同时在图像周围放置一个 VStack 并在其上方放置一个 Spacer() 不会改变结果。
HStack 不相关,仅显示,因为我需要在此构造中使用 ZStack。但主要问题在于 VStack,在 ZStack 的 Space 中缩放后它不会移动。
好像.scaleEffect 只是使用原始图像的位置和框架并将缩放后的图像放在中间。这是 scaleEffect 的限制吗?还有什么功能可以使用?
This is my View (reduced code): // 我将背景涂成紫色,以显示 ZStack 的完整大小
var body: some View {
ZStack(alignment: .bottom) {
Color.purple
Image(battlingIndividual.getMonster().getStatusImageName(battlingIndividual.status))
.resizable()
.scaledToFill()
.scaleEffect(battlingIndividual.getMonster().size.scaleValue)
HStack() {
SkillViews(battlingIndividual: battlingIndividual)
Spacer()
}
}
}
结果是这样的:
但它应该是这样的:
编辑:我为图像添加了背景,以显示图像在 ZStack 中居中。
解法: 在这种情况下我们不需要对齐,我们需要一个锚点:
.scaleEffect(battlingIndividual.getMonster().size.scaleValue, anchor: .bottom)
解决方案图片:
请将您的图像放在 VStack 中,并在图像上方放置一个 Spacer(),您的图像将位于 Stack 的底部。对齐 .bottom 只是为了将多个视图彼此对齐,但您的 Stack 中没有多个视图。 HStack 不计入对齐。
如果我在我的示例中尝试这个并缩小图像,
import SwiftUI
struct ContentView: View {
var body: some View {
ZStack {
Color.purple
VStack {
Spacer()
Image(systemName: "ladybug")
.resizable()
.scaledToFit()
.frame(width: 100, height: 100, alignment:
HStack {
Image(systemName: "hare")
.resizable()
.frame(width: 50, height: 50)
Image(systemName: "hare")
.resizable()
.frame(width: 50, height: 50)
Image(systemName: "hare")
.resizable()
.frame(width: 50, height: 50)
Spacer()
}
}
}
}
}
我明白了。
亲切的问候, MacUserT
我假设这个视图容器 ZStack
是一个单元格视图,所以你需要对齐的不是紧贴内容的 ZStack,而是包含那些怪物单元格的整个 HStack
,比如
HStack(alignment: .bottom) { // << here !!
ForEach ... {
MonsterCellView()
}
}
我明白了。 .scaleEffect 使用自己的anchor,可以设置为.bottom.
scaleEffect(_:anchor:) Apple Developer
因此我只需要将“ancor: .bottom”添加到 scaleEffect。
.scaleEffect(battlingIndividual.getMonster().size.scaleValue, anchor:
.bottom)
对于以下结果: