我有一个Image
,predictionManager.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
}
}
}
答案 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)
}
}
}