有些类型的转换不起作用,另一些则起作用-SwiftUI



我遇到一个问题,我试图为满足特定条件时出现的按钮使用转换。此按钮覆盖在另一个视图的顶部,并固定在底部。我想让它在出现时从底部向上滑动,在消失时向下滑动。

为此,我将使用.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 进行测试

最新更新