gpt4 book ai didi

SwiftUI:动画更改依赖于@ObjectBinding

转载 作者:行者123 更新时间:2023-12-01 04:28:10 24 4
gpt4 key购买 nike

SwiftUI 具有 .animate() 的隐式动画,以及使用 .withAnimation() 的显式.但是,我不知道如何为图像更改设置动画:

struct ImageViewWidget : View {
@ObjectBinding var imageLoader: ImageLoader

init(imageURL: URL) {
imageLoader = ImageLoader(imageURL: imageURL)
}

var body: some View {
Image(uiImage:
(imageLoader.data.count == 0) ? UIImage(named: "logo-old")! : UIImage(data: imageLoader.data)!)
.resizable()
.cornerRadius(5)
.frame(width: 120, height:120)
}
}

这个 ImageuiImage参数通过 old-logo (占位符)如果 imageLoader 中没有数据(a BindableObject ),并在异步加载后将其替换为正确的:
class ImageLoader : BindableObject {
let didChange = PassthroughSubject<Data, Never>()

var data = Data() {
didSet {
didChange.send(data)
}
}

init(imageURL: URL) {
print("Image loader being initted!")
let url = imageURL

URLSession.shared.dataTask(with: url) { (data, _, _) in
guard let data = data else { return }
DispatchQueue.main.async {
self.data = data
}
}.resume()

}
}

我怎样才能为这个变化设置动画, data.count不再是 0 ,我们有图像吗?说我想要一个淡出动画..

最佳答案

如果你想使用基于环境对象(或可观察对象)的显式动画,你需要在你的 View 中创建一些状态。
您可以使用 onReceive 对 View 中可观察对象的更改使用react,然后使用显式动画修改您的状态。

struct ImageViewWidget: View {
@ObservedObject var imageLoader: ImageLoader
@State var uiImage: UIImage = UIImage(named: "logo-old")!

init(imageURL: URL) {
imageLoader = ImageLoader(imageURL: imageURL)
}

var body: some View {
Image(uiImage: uiImage)
.resizable()
.cornerRadius(5)
.frame(width: 120, height: 120)
.onReceive(imageLoader.$data) { data in
if data.count != 0 {
withAnimation {
self.uiImage = UIImage(data: data)!
}
}
}
}
}

关于SwiftUI:动画更改依赖于@ObjectBinding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56613622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com