From d453a9433089acbc09d76375fea38f44444d0c0d Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Thu, 18 Jun 2020 17:37:29 -0500 Subject: [PATCH] Make unread and star animations cancel on cell reuse. Issue #2054 --- .../Cell/MasterTimelineTableViewCell.swift | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/iOS/MasterTimeline/Cell/MasterTimelineTableViewCell.swift b/iOS/MasterTimeline/Cell/MasterTimelineTableViewCell.swift index aa964b218..55183f29b 100644 --- a/iOS/MasterTimeline/Cell/MasterTimelineTableViewCell.swift +++ b/iOS/MasterTimeline/Cell/MasterTimelineTableViewCell.swift @@ -23,6 +23,9 @@ class MasterTimelineTableViewCell: VibrantTableViewCell { return NonIntrinsicImageView(image: AppAssets.timelineStarImage) }() + private var unreadIndicatorPropertyAnimator: UIViewPropertyAnimator? + private var starViewPropertyAnimator: UIViewPropertyAnimator? + var cellData: MasterTimelineCellData! { didSet { updateSubviews() @@ -35,7 +38,12 @@ class MasterTimelineTableViewCell: VibrantTableViewCell { } override func prepareForReuse() { + unreadIndicatorPropertyAnimator?.stopAnimation(true) + unreadIndicatorPropertyAnimator = nil unreadIndicatorView.isHidden = true + + starViewPropertyAnimator?.stopAnimation(true) + starViewPropertyAnimator = nil starView.isHidden = true } @@ -184,10 +192,15 @@ private extension MasterTimelineTableViewCell { func updateUnreadIndicator() { if !unreadIndicatorView.isHidden && cellData.read && !cellData.starred { - UIView.animate(withDuration: 0.66, animations: { self.unreadIndicatorView.alpha = 0 }) { _ in - self.unreadIndicatorView.isHidden = true - self.unreadIndicatorView.alpha = 1 + unreadIndicatorPropertyAnimator = UIViewPropertyAnimator(duration: 0.66, curve: .easeInOut) { [weak self] in + self?.unreadIndicatorView.alpha = 0 } + unreadIndicatorPropertyAnimator?.addCompletion { [weak self] _ in + self?.unreadIndicatorView.isHidden = true + self?.unreadIndicatorView.alpha = 1 + self?.unreadIndicatorPropertyAnimator = nil + } + unreadIndicatorPropertyAnimator?.startAnimation() } else { showOrHideView(unreadIndicatorView, cellData.read || cellData.starred) } @@ -195,10 +208,15 @@ private extension MasterTimelineTableViewCell { func updateStarView() { if !starView.isHidden && cellData.read && !cellData.starred { - UIView.animate(withDuration: 0.66, animations: { self.starView.alpha = 0 }) { _ in - self.starView.isHidden = true - self.starView.alpha = 1 + starViewPropertyAnimator = UIViewPropertyAnimator(duration: 0.66, curve: .easeInOut) { [weak self] in + self?.starView.alpha = 0 } + starViewPropertyAnimator?.addCompletion { [weak self] _ in + self?.starView.isHidden = true + self?.starView.alpha = 1 + self?.starViewPropertyAnimator = nil + } + starViewPropertyAnimator?.startAnimation() } else { showOrHideView(starView, !cellData.starred) }