你可以在消失时为 SwiftUI 视图设置动画吗?
Posted
技术标签:
【中文标题】你可以在消失时为 SwiftUI 视图设置动画吗?【英文标题】:Can you animate a SwiftUI View on disappear? 【发布时间】:2021-01-21 16:30:15 【问题描述】:我有一个 SwiftUI View
,它有一个运行 onAppear
的自定义动画。我也试图让视图动画onDisappear
,但它立即消失了。
以下示例重现了该问题 - MyText
视图应从左侧滑入并向右滑出。 id
修饰符用于确保每次值更改时都会呈现一个新视图,并且我已经确认 onAppear
和 onDisappear
确实每次都被调用,但动画 onDisappear
从未明显运行。我怎样才能做到这一点?
struct Survey: View
@State private var id = 0
var body: some View
VStack
MyText(text: "\(id)").id(id)
Button("Increment")
self.id += 1
struct MyText: View
@State private var offset: CGFloat = -100
let text: String
var body: some View
return Text(text)
.offset(x: offset)
.onAppear()
withAnimation(.easeInOut(duration: 2))
self.offset = 0
.onDisappear()
withAnimation(.easeInOut(duration: 2))
self.offset = 100
【问题讨论】:
【参考方案1】:可能你想要过渡,比如
struct Survey: View
@State private var id = 0
var body: some View
VStack
MyText(text: $id)
Button("Increment")
self.id += 1
struct MyText: View
@Binding var text: Int
var body: some View
return Text("\(text)").id(text)
.frame(maxWidth: .infinity)
.transition(.slide)
.animation(.easeInOut(duration: 2))
【讨论】:
干得好! :) 但是,关于这个问题,严格来说,这太糟糕了,这在 2021 年的 SwiftUI 中仍然无法原生提供。 也作为后续问题......在子视图中使用绑定有什么好处?无论哪种方式,它似乎都有效。【参考方案2】:恐怕它无法工作,因为一旦隐藏视图就会调用 .onDisappear 修饰符。 但是这里有一个很好的答案: Is there a SwiftUI equivalent for viewWillDisappear(_:) or detect when a view is about to be removed?
【讨论】:
以上是关于你可以在消失时为 SwiftUI 视图设置动画吗?的主要内容,如果未能解决你的问题,请参考以下文章