我遇到一个问题,我试图为满足特定条件时出现的按钮使用转换。此按钮覆盖在另一个视图的顶部,并固定在底部。我想让它在出现时从底部向上滑动,在消失时向下滑动。
为此,我将使用.transition(.move(edge: .bottom).animation(.linear))
。然而,它根本不起作用——它只是突然出现,然后又弹出,没有任何滑动或动画。
更奇怪的是,当我使用.opacity.animation(.linear)
或.scale.animation(.linear)
时,转换确实有效果,但对任何其他转换都不起作用。
代码如下:
var body: some View {
ScrollView {
// ...
}
.overlay(alignment: .bottom) {
if condition {
Button(action: { /* ... */ }) {
Text("Share")
}
.background { LinearGradient(...) }
.clipShape(Capsule())
.transition(.move(edge: .bottom).animation(.linear))
}
}
}
知道为什么转换只适用于.opacity
和.scale
,以及我如何使它适用于.move(edge: .bottom)
吗?
将条件包装到容器中,这样就有了一个可以为其设置动画的父级,比如
.overlay(alignment: .bottom) {
VStack { // << here !!
if condition {
Button(action: { /* ... */ }) {
Text("Share")
}
.background { LinearGradient(...) }
.clipShape(Capsule())
.transition(.move(edge: .bottom))
}
}
.animation(.linear, value: condition) // << important !!
}
使用Xcode 13.2/iOS 15.2 进行测试