Случайная нить 1: ошибка EXC_BAD_ACCESS (code = EXC_I386_GPFLT) во время последовательности каскадной анимации Swift - PullRequest
0 голосов
/ 31 октября 2019

Я кодирую анимацию при посадке, чтобы быстро объяснить пользовательский интерфейс при запуске приложения 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()
    }
...