在SwiftUI中更改视图(例如图像)的内容时,是否可以淡入/淡出视图?

时间:2019-11-15 22:45:47

标签: swift swiftui

我有一个ImagepredictionManager.prediction.sentiment.currentSentiment.0,其中predictionManager@EnvironmentObject,而predictionManager.prediction@Published变量。 predictionManager.prediction.sentiment.currentSentiment.0更改为新的Image,这时我希望原来的Image淡出,而新的{@ 1}}淡入。

我试图通过使用.onReceive(publisher:) {}修饰符来做到这一点,例如:

struct ContentView: View {
    [...]

    @EnvironmentObject private var predictionManager: PredictionManager
    @State private var imageOpacity: Double = 1

    var body: some View {
        NavigationView {
            VStack {
                Spacer()
                predictionManager.prediction.sentiment.currentSentiment.0
                    .font(.system(size: 100))
                    .opacity(imageOpacity)
                    .padding()
                    .onReceive(predictionManager.objectWillChange) {
                        imageOpacity = 0
                    }

                [...]
            }
        }
    }
}

但是,此代码将始终将原始Image的不透明度设置为0-永远不会将其设置回1。由于没有(据我所知)在状态更新和图像被关闭(或达到某种效果)后调用的afterUpdate()方法,那么如何实现我的目标?

如果有帮助,我想在UIKit中我想做类似以下的事情(我将不测试代码,因此至少它将用作伪代码以帮助描述问题) ):

var imageView = UIImageView() {
    willSet {
        UIView.animate(withDuration: 1) {
            self.imageView.alpha = 0
        }
    }
    didSet {
        UIView.animate(withDuration: 1) {
            self.imageView.alpha = 1
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在这种情况下可以使用显式动画。希望下面的示例可以在这个方向上为您提供帮助

struct ContentView: View {

    @State private var opacity = 0.2

    var body: some View {
        Button(action: {

            withAnimation (.linear(duration: 2)) {
                self.opacity += 0.2
            }

        })  {
            Text("Animate Opacity")
            .padding()
            .opacity(opacity)
        }
    }
}