Koloda - 加载时动画随机播放效果

Koloda - Animate shuffle effect on load

我正在使用 Koloda 展示一副可以刷过的扑克牌。我有这部分工作得很好。

当我最初加载这副纸牌时,我希望每个视图/纸牌分别飞入,然后显示为堆叠。我将其称为洗牌或 deal 效果(就像发牌时一样)。据我所知,Koloda 似乎不允许这样做。我看到的动画是在它们已经堆叠之后显示整个视图/帧堆栈。所以在我的例子中,这意味着整个甲板。我也没有看到一种在不导致完全重新加载的情况下逐一添加视图/卡片的方法。

如果我有 3 张卡片,这是我希望它的工作方式

卡片 1(卡片底部以动画方式从左侧飞入)

.2 秒等待

卡牌 2(牌组底部第二张/中间卡牌飞入)

.2 秒等待

卡片 3(卡片顶部飞入)

按照正常的 Koloda View 进行操作。

我已经尝试将动画添加到我的 UIView 中,但它看起来不正确。我目前的猜测是使用 animateAppearanceWithCompletion 的自定义动画,但我运气不佳。还有一个 frameForCard 方法可能有用吗?

如果有帮助,我正在项目中使用 Snapkit。我的目标是 iOS 9+

我继承了 KolodaViewAnimator 并覆盖了初始加载动画

override func animateAppearanceWithCompletion(_ completion: KolodaViewAnimator.AnimationCompletionBlock) {

    self.koloda?.alpha = 1.0

    // custom extension method to return my CardView
    let cards = self.koloda!.cards().reversed()
    for (index, card) in cards.enumerated() {
        let delay = Double(index) * 0.2
        card.display(delay: delay)
    }

    completion?(true)
}

因为我的目标是 iOS 9+,所以我可以在自定义视图的初始化/设置阶段使用转换。从屏幕开始。

self.mySubView?.transform = CGAffineTransform(translationX: self.frame.width * -2, y: 0)

调用 display() 以从子类 ViewAnimator 触发动画

    func display(delay: TimeInterval) {

        UIView.animate(withDuration: 0.2, delay: delay, options: [], animations: {
// could be a subview
            self.mySubView.transform = CGAffineTransform(translationX: 0, y: 0)

        }) { (_) in

        }

    }