Как остановить/приостановить анимацию ограничений автоопределения (в быстрой)?
Этот пост показывает, как можно оживить изменения ограничений автоопределения, что очень полезно.
Теперь мне также нужна возможность остановить/приостановить эту анимацию, когда пользователь нажимает кнопку так же, как нажатие паузы на видео. Мой случай использования буквально таков: Пользователь играет музыку, нажимая кнопку, которая также запускает анимацию фонового изображения, которая просто включает в себя переключение изображений плюс перевод каждого изображения из (x1, y1) в (x2, y2). Когда пользователь нажимает кнопку паузы, музыка приостанавливается, и я также хочу, чтобы анимация фонового изображения приостанавливалась, потому что для всех целей и задач эта функция похожа на воспроизведение видео.
Первый метод, который я пытался, делал что-то вроде
self.displayBackgroundImage.layer.removeAllAnimations()
В то время как это останавливает анимацию в порядке, она также перескакивает до конца анимации, что нежелательно. Я также пробовал что-то вроде этого другого сообщения, которое включает в себя запуск еще одной очень короткой анимации с этой опцией
options: UIViewAnimationOptions.BeginFromCurrentState,
но это не останавливает анимацию на ограничениях, или, по крайней мере, я не понял, как заставить ее работать. Один комментарий в первом сообщении, который я упомянул, отметил, что анимация ограничений выполняется совершенно отдельно от другой анимации, которая дает мне ощущение, что нужно, что-то связано с .layoutIfNeeded()
.
Как это можно сделать? Вот как я настраиваю анимацию ограничений, которая работает именно так, как я хочу:
// first transition the image and its size & position
UIView.transitionWithView(self.displayBackgroundImage,
duration: imageCrossDissolveResolution,
options: UIViewAnimationOptions.TransitionCrossDissolve,
animations: {
self.displayBackgroundImage.image = backgroundImages[imageIndex].file
self.displayBackgroundImage.contentMode = UIViewContentMode.ScaleToFill
self.displayBackgroundConstraintLeft.constant = backgroundImages[imageIndex].x + constraintLeftRightOffset
self.displayBackgroundConstraintRight.constant = self.screenWidth - (backgroundImages[imageIndex].x + backgroundImages[imageIndex].width) + constraintLeftRightOffset
self.displayBackgroundConstraintTop.constant = backgroundImages[imageIndex].y
self.displayBackgroundConstraintBottom.constant = self.screenHeight - (backgroundImages[imageIndex].y + backgroundImages[imageIndex].height)
},
completion: { (finished: Bool) -> Void in
// then pan the image
UIView.animateWithDuration(imagePanningResolution,
delay: imagePanningDelay,
options: UIViewAnimationOptions.CurveEaseInOut,
animations: {
self.displayBackgroundConstraintLeft.constant = backgroundImages[imageIndex].xEnd + constraintLeftRightOffset
self.displayBackgroundConstraintRight.constant = self.screenWidth - (backgroundImages[imageIndex].xEnd + backgroundImages[imageIndex].width) + constraintLeftRightOffset
self.displayBackgroundConstraintTop.constant = backgroundImages[imageIndex].yEnd
self.displayBackgroundConstraintBottom.constant = self.screenHeight - (backgroundImages[imageIndex].yEnd + backgroundImages[imageIndex].height)
self.view.layoutIfNeeded()
},
completion: nil)})
Идея. Как только начинается такая анимация, существует ли способ определить значения констант ограничения в реальном времени? Если возможно, я могу начать новую анимацию, установив константы в их текущие значения, используя идею .BeginFromCurrentState
?
Спасибо.