簡體   English   中英

SwiftUI:將動畫附加到過渡

[英]SwiftUI: attach an animation to a transition

根據 Apple 文檔,我們應該能夠將動畫直接附加到過渡。 例如:

.transition(AnyTransition.slide.animation(.linear))

該方法的文檔:

extension AnyTransition {

    /// Attach an animation to this transition.
    public func animation(_ animation: Animation?) -> AnyTransition
}

說:

概括

將動畫附加到此過渡。

但我無法讓它發揮作用。 看看這個最小可行的例子(你可以復制粘貼它並自己嘗試):

import SwiftUI

struct AnimationTest: View {
    @State private var show = false
    var body: some View {
        VStack {
            if show {
                Color.green
                    .transition(AnyTransition.slide.animation(.linear))
            } else {
                Color.yellow
                    .transition(AnyTransition.slide.animation(.linear))
            }
            Button(action: {
                self.show.toggle()
            }, label: {
                Text("CHANGE VIEW!")
            })
        }
    }
}

struct AnimationTest_Previews: PreviewProvider {
    static var previews: some View {
        AnimationTest()
    }
}

如您所見,根本沒有動畫發生。 有任何想法嗎? 謝謝你。

您需要將布爾切換包裝在withAnimation()閉包中:

withAnimation {
    self.show.toggle()
}

模擬器上測試了在 Xcode 11.2.1 上工作的過渡; 畫布不預覽它。

請注意,直接應用於視圖的動畫/過渡會對該特定視圖及其子視圖產生影響。 此外,根據文檔:

func animation(Animation?) -> View

將給定的動畫應用於視圖中的所有動畫值。

由於可動畫值(在本例中為啟用過渡的 Bool 切換)在 Color 視圖的外部,因此必須從按鈕操作中設置的位置顯式設置動畫。 或者,可以有效地將過渡直接附加到目標視圖,但將動畫應用到它們的容器,從而實現更改的插值以show . 所以,這也達到了預期的結果:

struct AnimationTest: View {
    @State private var show = false
    var body: some View {
        VStack {
            if show {
                Color.green
                    .transition(.slide)
            } else {
                Color.yellow
                    .transition(.slide)
            }
            Button(action: {
                self.show.toggle()
            }, label: {
                Text("CHANGE VIEW!")
            })
        }
        .animation(.linear)
    }
}

這些修改器僅指定過渡期間要使用的動畫種類,而不會激活它們。 您需要顯式激活動畫。 就你而言

withAnimation {
    self.show.toggle()
}

注意:轉換在預覽版,模擬器或真實設備上的測試中不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM