Koloda - Анимированный эффект тасования на нагрузке

Я использую Koloda, чтобы представить колоду игральных карт, которые можно пролистать. У меня эта часть работает хорошо.

Когда я первоначально загружаю эту колоду карт, я бы хотел, чтобы каждый вид / карта летел отдельно, а затем отображался как сложенный. Я бы назвал это случайным или deal эффект (например, когда вы сдаете карты). Из того, что я могу сказать, кажется, что Колода не допускает этого. Анимации, которые я вижу, предназначены для показа всего стека представлений / кадров после того, как они уже сложены. Так что в моем примере это будет означать всю колоду. Я также не вижу способа добавления просмотров / карт 1 к 1 без полной перезагрузки.

Вот как бы я хотел, чтобы у меня было 3 карты

Карта 1 (нижняя часть колоды летит слева в анимационном стиле)

.2 секундное ожидание

Карта 2 (2-ая снизу колоды / средняя карта)

.2 секундное ожидание

Карта 3 (летит верх колоды)

Действуйте как обычно Koloda View.

Я попытался добавить анимации в мои UIViews, которые добавляются как contentViews, но это выглядит неправильно. Моя текущая догадка - это пользовательская анимация animateAppearanceWithCompletion но мне не очень повезло. Также есть frameForCard метод, который может работать?

Я использую Snapkit в проекте, если это поможет. Я ориентируюсь на iOS 9+

1 ответ

Решение

Я переклассифицировал 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

        }

    }
Другие вопросы по тегам