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
};
}