首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SwiftUI对一系列图像进行动画处理?

如何使用SwiftUI对一系列图像进行动画处理?
EN

Stack Overflow用户
提问于 2019-06-23 17:44:16
回答 4查看 4K关注 0票数 6

如何使用SwiftUI框架对一系列图像(比如从Frame-1.png到Frame-6)进行动画处理?

我试着创建一个“图像”数组。然后,我将图像(with: images,duration: 1.0)方法赋值给一个名为"animatedImage“的变量。最后,我在"ContentView.swift”的"body“中尝试了UIImage.animatedImage(uiImage: animatedImage)。

代码语言:javascript
复制
var images: [UIImage]! = [UIImage(named: "Sequence/frame-1")!,
                          UIImage(named: "Sequence/frame-2")!,
                          UIImage(named: "Sequence/frame-3")!,
                          UIImage(named: "Sequence/frame-4")!,
                          UIImage(named: "Sequence/frame-5")!,
                          UIImage(named: "Sequence/frame-6")!
]

let animatedImage : UIImage! = UIImage.animatedImage(with: images, duration: 1.0)

//////Then in the ContentView.swift I've tried this code:

struct ContentView : View {
    var body: some View {

        Image(uiImage: animatedImage)

    }
}

当我运行程序时,它只显示第一帧,但我希望看到帧的动画

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-09-02 05:27:24

公认的答案非常有效,但bhagyash ingale提到的不幸问题使其很难使用。如果可以通过协议或其他方式重用Image的特定方法,这将是很有用的。我有一个非常差的,也许是巨大的加农炮为这个苍蝇解决方案,也许它会更容易,但现在…

代码语言:javascript
复制
class LoadingTimer {

    let publisher = Timer.publish(every: 0.1, on: .main, in: .default)
    private var timerCancellable: Cancellable?

    func start() {
        self.timerCancellable = publisher.connect()
    }

    func cancel() {
        self.timerCancellable?.cancel()
    }
}
代码语言:javascript
复制
struct LoadingView: View {

    @State private var index = 0

    private let images = (0...7).map { UIImage(named: "Image-\($0).jpg")! }
    private var timer = LoadingTimer()

    var body: some View {

        return Image(uiImage: images[index])
            .resizable()
            .frame(width: 100, height: 100, alignment: .center)
            .onReceive(
                timer.publisher,
                perform: { _ in
                    self.index = self.index + 1
                    if self.index >= 7 { self.index = 0 }
                }
            )
            .onAppear { self.timer.start() }
            .onDisappear { self.timer.cancel() }
    }
}

我不喜欢这样,但它可以完成工作,并依赖于Image

票数 7
EN

Stack Overflow用户

发布于 2020-07-04 01:53:32

不带组合的版本

代码语言:javascript
复制
import SwiftUI

struct AnimatingImage: View {
    let images: [Image]

    @ObservedObject private var counter = Counter(interval: 0.05)
        
    var body: some View {
        images[counter.value % images.count]
    }
}

private class Counter: ObservableObject {
    private var timer: Timer?

    @Published var value: Int = 0
    
    init(interval: Double) {
        timer = Timer.scheduledTimer(withTimeInterval: interval, repeats: true) { _ in self.value += 1 }
    }
}

你可以使用它

代码语言:javascript
复制
struct LoadingView: View {
    private let images = (1...20).map { String(format: "i_%02d", $0) }.map { Image($0) }
    
    var body: some View {
        AnimatingImage(images: images)
    }
}
票数 5
EN

Stack Overflow用户

发布于 2019-06-23 23:09:00

你有没有试过制作自己的视图包装器?

如下所示:

代码语言:javascript
复制
struct AnimatedImage: UIViewRepresentable {
    func makeUIView(context: Self.Context) -> UIImageView {
        return UIImageView(image: animatedImage)
    }

    func updateUIView(_ uiView: UIImageView, context: UIViewRepresentableContext<AnimatedImage>) {
    }
}

用法如下:

代码语言:javascript
复制
struct ContentView : View {
    var body: some View {
        AnimatedImage()
    }
}

不确定这是否能解决你的问题,至少它不再是一个静态图像:D

在Xcode Beta 2模拟器上试用过。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56722695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档