iOS остановить animateWithDuration до завершения

У меня есть CollectionView, и я хочу создать анимацию внутри CollectionViewCell, выбранной пользователем. Я решил использовать animateKeyframesWithDuration, потому что я хочу создать собственную анимацию шаг за шагом. Мой код выглядит так:

func animate() {
    UIView.animateKeyframesWithDuration(1.0, delay: 0.0, options: .AllowUserInteraction, animations: { () -> Void in
        UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.5, animations: { () -> Void in
            //  First step
        })
        UIView.addKeyframeWithRelativeStartTime(0.5, relativeDuration: 0.5, animations: { () -> Void in
            //  Second step
        })
        }) { (finished: Bool) -> Void in
            if self.shouldStopAnimating {
                self.loadingView.layer.removeAllAnimations()
            } else {
                self.animate()
            }
        }
}

Это выполняется внутри пользовательского CollectionViewCell, когда он выбран. Проблема в том, что я хочу принудительно остановить анимацию в определенный момент. Но когда я это делаю, анимация не останавливается полностью, она просто перемещает оставшуюся анимацию в другую ячейку (возможно, в последнюю повторно использованную ячейку?)

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

У кого-нибудь есть идеи по этому поводу?

1 ответ

Вместо удаления анимации из слоя вы можете попробовать добавить другую анимацию с очень короткой продолжительностью, которая устанавливает свойства вида, которые вы хотите остановить анимацию.

Что-то вроде этого:

if self.shouldStopAnimating {
    UIView.animateWithDuration(0.01, delay: 0.0, options: UIViewAnimationOptions.BeginFromCurrentState, animations: { () -> Void in
        //set any relevant properties on self.loadingView or anything else you're animating
        //you can either set them to the final animation values
        //or set them as they currently are to cancel the animation
    }) { (completed) -> Void in
    };
}

Этот ответ также может быть полезным.

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