UIPropertyAnimator вызывает сбой - PullRequest
       2

UIPropertyAnimator вызывает сбой

0 голосов
/ 26 сентября 2019

У меня странный сбой, вызванный UIPropertyAnimtor.У меня UICollectionView с пользовательским макетом (для растянутого заголовка), и я использую UIPropertyAnimator для анимации размытия, когда UICollectionView опущен вниз.

Проблема в том, что когда я закрываю сцену (иногда после повторного нажатия), приложение вылетает со следующим сообщением:

objc[11346]: Cannot form weak reference to instance (0x121eeda60) of class [APPLICATION_NAME].StrechyHeaderCollectionReusableView. It is possible that this object was over-released, or is in the process of deallocation.

enter image description here

Когда я возвращаюсь назад, инкод на то, что вызвало сбой, это вызов в deinit.Во всяком случае, как я понимаю UIPropertyAnimator все сделано правильно.Без! Animator.stopAnimation (true) the app would crash due to unreleased UIProperyAnimator`.

enter image description here

Это код в моем представлении заголовка:

final class StrechyHeaderCollectionReusableView: UICollectionReusableView, Nibable {

    // some code...

    lazy var animator: UIViewPropertyAnimator = {
        UIViewPropertyAnimator(duration: 3.0, curve: .easeOut, animations: { [weak self] in
            self?.blurVisualEffectView.effect = UIBlurEffect(style: .dark)
        })
    }()

    override func awakeFromNib() {
        super.awakeFromNib()

        blurVisualEffectView.effect = nil
    }

    // some code...

    deinit {
        animator.stopAnimation(true)
    }
}

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

func scrollViewDidScroll(_ scrollView: UIScrollView) {

    // some code...

    let strechyHeader = headerView(in: collectionView)
    strechyHeader?.isBackButtonHidden = isBackButtonHidden

    if scrollView.contentOffset.y > 0 {
        strechyHeader?.animator.fractionComplete = 0
    } else {
        strechyHeader?.animator.fractionComplete = abs(scrollView.contentOffset.y) / 100
    }
}

Есть идеи?Спасибо, ребята!

1 Ответ

0 голосов
/ 26 сентября 2019

Попробуйте позвонить finishAnimation в вашем методе деинициализации:

guard animator.state == .active else { return }
animator.stopAnimation(false)
animator.finishAnimation(at: .start)

UPD:

Старайтесь не использовать ленивый аниматор:

 private var animator: UIViewPropertyAnimator?

    override func awakeFromNib() {
        super.awakeFromNib()

        animator = UIViewPropertyAnimator(
               duration: 3.0,
               curve: .easeOut,
               animations: { [weak self] in
                   self?.blurVisualEffectView.effect = UIBlurEffect(style: .dark)
               })
        blurVisualEffectView.effect = nil
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...