我试图动画一个SwiftUI视图的偏移,同时淡出并移除该视图的一个子视图。我遇到的问题是,SwiftUI执行偏移和淡出动画,但不合并它们。
我想要实现的是动画化整个SubView
的位置,同时淡出字幕文本,使字幕文本在淡入或淡出时垂直移动。我可以通过动画化Text
的不透明度来实现这一点,而不是删除它,但这意味着文本仍将占用“布局空间”。
有办法用if showSubtitle
语句来实现这个动画吗?
下面的代码和GIF演示了这个问题:
struct ContentView: View {
@State private var showSubtitle = true
var body: some View {
SubView(showSubtitle: showSubtitle)
.animation(.default)
.offset(y: showSubtitle ? 100 : 0)
.onTapGesture {
self.showSubtitle.toggle()
}
}
}
struct SubView: View {
let showSubtitle: Bool
var body: some View {
VStack {
Text("Header")
if showSubtitle {
Text("Subtitle")
}
}
}
}
发布于 2020-07-03 15:27:42
实际上,观察到的行为是因为.offset
不改变布局,视图位于相同的位置。因此,当您移除子视图时,它将被移除并动画化(使用默认的.opacity
转换)。开始抵消的部分不包含已经包含的子视图,所以在向上移动的部分中看不到它。
这里有一些可能会产生某种效果的东西,但是转换是基于源大小的,所以它并不是手动指定的偏移量的距离。总之,试着:
if showSubtitle {
Text("Subtitle")
.transition(AnyTransition.opacity.combined(with: AnyTransition.move(edge: .top)))
}
用Xcode 12 / iOS 14测试
https://stackoverflow.com/questions/62717876
复制相似问题