Я кодирую анимацию при посадке, чтобы быстро объяснить пользовательский интерфейс при запуске приложения firs, поэтому я настроил серию анимаций в каскаде, первая - на главном виртуальном канале, а другая - на боковом меню. запускать все плавно, пока я не переключусь с UIView.animate
на UIViewPropertyAnimator.runningPropertyAnimator
, поскольку я пытался отменить все текущие анимации, пользователь покинул экран, все еще используя UIView.animate
, и потерпел неудачу. Я переключился, потому что с UIViewPropertyAnimator
вы можете остановить анимации, но вы можете отменить их? Моя цель - сбросить их, когда вы покидаете экран, на котором они запущены. Например: если анимация mapOnboarding
запущена и вы нажимаете кнопку меню, она останавливается и сбрасывается, слайд-меню скользит и запускается анимация menuOnboarding
.
Но теперь я случайно получаю эту ошибку:
Поток 1: EXC_BAD_ACCESS (code = EXC_I386_GPFLT)
Я получаю его в разных строках, где новая анимация определена в обработчике соревнования предыдущего, независимо от того, какая из двуханимация запущена, и я не могу понять, что это вызывает. Я просто неправильно использую UIPropertyAnimator
, и причиной ошибки является каскад анимации или что еще это может быть? Иногда одна анимация запускается без сбоев, но затем происходит сбой другой. Поскольку это происходит случайным образом как на главном экране, так и на слайде в экранах меню, я просто оставлю одну из двух функций, чтобы не засорять вопрос. Всегда большое спасибо за вашу помощь.
Это одна из двух анимационных функций:
func mapOnboarding(){
let animator = UIViewPropertyAnimator()
animator.isInterruptible = true
animator.stopAnimation(true)
// hide hint views
menuHintView.alpha = 0
mapHintView.alpha = 1
menuHintImage.alpha = 0
alertHintImage.alpha = 0
trackingHintImage.alpha = 0
centerHintImage.alpha = 0
mapHintTextView.alpha = 0
// set parameters
mapHintView.backgroundColor = .clear
mapHintBlurredView.alpha = 0.1
mapHintBlurredView.backgroundColor = Theme.firstTintColor
let menuHint = UIImage(named: "Hint image")
let tintedMenuHintImage = menuHint?.withRenderingMode(.alwaysTemplate)
menuHintImage.image = tintedMenuHintImage
menuHintImage.tintColor = Theme.firstTintColor
let downHint = UIImage(named: "Hint image down")
let tintedDownHint = downHint?.withRenderingMode(.alwaysTemplate)
alertHintImage.image = tintedDownHint
alertHintImage.backgroundColor = .clear
alertHintImage.tintColor = Theme.firstTintColor
trackingHintImage.image = tintedDownHint
trackingHintImage.backgroundColor = .clear
trackingHintImage.tintColor = Theme.firstTintColor
centerHintImage.image = tintedDownHint
centerHintImage.backgroundColor = .clear
centerHintImage.tintColor = Theme.firstTintColor
mapHintTextView.textColor = Theme.labelTextColor
mapHintTextView.backgroundColor = .clear
// MARK:- Map onboarding animation
mapHintTextView.text = NSLocalizedString("MapHint1", comment: "")
// UIView.animate(withDuration: 0.5, delay: 1, options: .curveLinear, animations: {
animator.addAnimations {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.5, delay: 1, options: .curveLinear, animations: {
self.menuHintImage.alpha = 1
self.mapHintTextView.alpha = 1
}) { (true) in
// UIView.animate(withDuration: 0.5, delay: 4, options: .curveLinear, animations: {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.5, delay: 4, options: .curveLinear, animations: {
self.menuHintImage.alpha = 0
self.mapHintTextView.alpha = 0
}) { (true) in
self.mapHintTextView.text = NSLocalizedString("MapHint2", comment: "")
// UIView.animate(withDuration: 0.5, delay: 4, options: .curveLinear, animations: {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.0, delay: 4, options: .curveLinear, animations: {
print("Changed text to Alert")
}) { (true) in
// UIView.animate(withDuration: 0.5, delay: 4, options: .curveLinear, animations: {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.5, delay: 4, options: .curveLinear, animations: {
self.alertHintImage.alpha = 1
self.mapHintTextView.alpha = 1
}) { (true) in
// UIView.animate(withDuration: 0.5, delay: 4, options: .curveLinear, animations: {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.5, delay: 4, options: .curveLinear, animations: {
self.alertHintImage.alpha = 0
self.mapHintTextView.alpha = 0
}) { (true) in
self.mapHintTextView.text = NSLocalizedString("MapHint3", comment: "")
// UIView.animate(withDuration: 0, delay: 0, options: .curveLinear, animations: {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.0, delay: 0.0, options: .curveLinear, animations: {
print("Changed text to Tracking")
}) { (true) in
// UIView.animate(withDuration: 0.5, delay: 1, options: .curveLinear, animations: {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.5, delay: 1, options: .curveLinear, animations: {
self.trackingHintImage.alpha = 1
self.mapHintTextView.alpha = 1
}) { (true) in
// UIView.animate(withDuration: 0.5, delay: 10, options: .curveLinear, animations: {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.5, delay: 10, options: .curveLinear, animations: {
self.trackingHintImage.alpha = 0
self.mapHintTextView.alpha = 0
}) { (true) in
self.mapHintTextView.text = NSLocalizedString("MapHint4", comment: "")
// UIView.animate(withDuration: 0, delay: 0, options: .curveLinear, animations: {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.0, delay: 0, options: .curveLinear, animations: {
print("Changed text to Center Map")
}) { (true) in
// UIView.animate(withDuration: 0.5, delay: 1, options: .curveLinear, animations: {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.5, delay: 1, options: .curveLinear, animations: {
self.centerHintImage.alpha = 1
self.mapHintTextView.alpha = 1
}) { (true) in
// UIView.animate(withDuration: 0.5, delay: 6, options: .curveLinear, animations: {
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.5, delay: 6, options: .curveLinear, animations: {
self.centerHintImage.alpha = 0
self.mapHintTextView.alpha = 0
self.mapHintView.alpha = 0
}) { (true) in
print("Map onboard finished")
}
}
}
}
}
}
}
}
}
}
}
}
animator.startAnimation()
}