【问题标题】:How to set a delay for the animated Image in SwiftUI?如何在 SwiftUI 中为动画图像设置延迟?
【发布时间】:2020-05-21 14:07:14
【问题描述】:

我想让动物以不同的延迟眨眼Int.random(in: 1..<9)

问题是:

UIView 动画和异步线程延迟有解决方案...但是UIImage.animatedImage 有什么方法可以在闪烁之间进行延迟吗?

如果根本没有方法 - 我该如何解决我的问题?

代码:

所有动画的文件:

 import SwiftUI
  struct AnimalAnimation: UIViewRepresentable {
    @Binding var animalImages: [UIImage?]
    @Binding var size: CGRect

    func makeUIView(context: Self.Context) -> UIView {

        let someView = UIView(frame: CGRect(x: size.minX, y: size.minY , width: size.width, height: size.height))
        let someImage = UIImageView(frame: CGRect(x: 0, y: 0, width: size.width, height: size.height))
        let animated = UIImage.animatedImage(with: animalImages as! [UIImage], duration: 0.9)!

        someImage.clipsToBounds = true
        someImage.autoresizesSubviews = true
        someImage.contentMode = UIView.ContentMode.scaleAspectFit
        someImage.image = animated
        someView.addSubview(someImage)
        return someView
    }

    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<AnimalAnimation>) {
    }
  }

我在 ContentViewbody 中使用它

            VStack {
                    AnimalAnimation(animalImages: $animal1Array, size: $animal1Size)
            }

图片:

animalImages = [UIImage(named: "eyes-open"),UIImage(named: "eyes-closed")]

【问题讨论】:

  • 闪烁在哪里?目前尚不清楚预期的延迟时间。
  • @Asperi, animalImages = [UIImage(named: "eyes-open"),UIImage(named: "eyes-closed")]

标签: ios image animation swiftui delay


【解决方案1】:

这是 SwiftUI 唯一的变体。使用 Xcode 11.4 / iOS 13.4 测试。 (大小/框架如果需要可以配置,对于演示没关系)

struct EyesBlinkView: View {

    enum EyesState: String {
        case open = "eyes-open"
        case closed = "eyes-closed"
    }

    @State private var eyesState = EyesState.open
    var body: some View {
        Image(eyesState.rawValue).resizable().scaledToFit()
            .onAppear { self.blink() }
    }

    private func blink() {
        self.eyesState = .closed
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.9) {
            self.eyesState = .open

            DispatchQueue.main.asyncAfter(deadline: 
                  DispatchTime.now().advanced(by: .seconds(Int.random(in: 1..<9)))) {
                self.blink()
            }
        }
    }
}

【讨论】:

  • @Aspari, 足够完美)如果我们有 7-10 个空闲对象作为眼睛怎么办?它不会损害我们的记忆力吗?
  • @Oleksandr, 嗯...很难说...这个结构值的大小是 16 字节 ))...一位酷哥有一天说 64kB 内存对于任何程序都应该足够了- 你的 10 个值会满足这一点。我认同。 8^)
【解决方案2】:

为什么不在数组中再次添加相同的图像,让它“看起来”有延迟?

【讨论】:

  • 它不是机关枪 ))) 它是空闲的物体。他们必须每 1-9 秒眨一次眼睛。如果我再放一张图片 - 他们会更频繁地剪辑。如果要制作一个巨大的“持续时间” - 它根本不会闪烁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多