From ab77ad89b449b8c415441a6ac97e0922d6900dcc Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sat, 12 Sep 2020 13:02:19 -0400 Subject: [PATCH] Use cross fade transitions if reduce motion/prefer cross fade is enabled --- ...tContainerDismissAnimationController.swift | 26 ++++++++++++++++- ...ainerPresentationAnimationController.swift | 29 ++++++++++++++++++- .../UIAccessibility+BackwardsCompat.swift | 18 ++++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 Sources/SheetController/UIAccessibility+BackwardsCompat.swift diff --git a/Sources/SheetController/SheetContainerDismissAnimationController.swift b/Sources/SheetController/SheetContainerDismissAnimationController.swift index 3ad3426..7067974 100644 --- a/Sources/SheetController/SheetContainerDismissAnimationController.swift +++ b/Sources/SheetController/SheetContainerDismissAnimationController.swift @@ -11,7 +11,11 @@ import UIKit class SheetContainerDismissAnimationController: NSObject, UIViewControllerAnimatedTransitioning { func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { - return 0.5 + if UIAccessibility.prefersCrossFadeTransitionsBackwardsCompat && (transitionContext?.viewController(forKey: .from) as? SheetContainerViewController)?.dismissAnimationInitialVelocity == nil { + return 0.25 + } else { + return 0.5 + } } func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { @@ -19,6 +23,11 @@ class SheetContainerDismissAnimationController: NSObject, UIViewControllerAnimat fatalError() } + if UIAccessibility.prefersCrossFadeTransitionsBackwardsCompat && fromVC.dismissAnimationInitialVelocity == nil { + animateCrossFadeTransition(using: transitionContext) + return + } + fromVC.view.alpha = 1.0 fromVC.dimmingView.isHidden = true @@ -57,4 +66,19 @@ class SheetContainerDismissAnimationController: NSObject, UIViewControllerAnimat animator.startAnimation() } + func animateCrossFadeTransition(using transitionContext: UIViewControllerContextTransitioning) { + guard let fromVC = transitionContext.viewController(forKey: .from) as? SheetContainerViewController else { + fatalError() + } + + transitionContext.containerView.addSubview(fromVC.view) + + let duration = transitionDuration(using: transitionContext) + UIView.animate(withDuration: duration) { + fromVC.view.alpha = 0 + } completion: { (finished) in + transitionContext.completeTransition(!transitionContext.transitionWasCancelled) + } + } + } diff --git a/Sources/SheetController/SheetContainerPresentationAnimationController.swift b/Sources/SheetController/SheetContainerPresentationAnimationController.swift index 981f76f..2b85c30 100644 --- a/Sources/SheetController/SheetContainerPresentationAnimationController.swift +++ b/Sources/SheetController/SheetContainerPresentationAnimationController.swift @@ -11,7 +11,11 @@ import UIKit class SheetContainerPresentationAnimationController: NSObject, UIViewControllerAnimatedTransitioning { func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { - return 0.5 + if UIAccessibility.prefersCrossFadeTransitionsBackwardsCompat { + return 0.25 + } else { + return 0.5 + } } func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { @@ -19,6 +23,11 @@ class SheetContainerPresentationAnimationController: NSObject, UIViewControllerA fatalError() } + if UIAccessibility.prefersCrossFadeTransitionsBackwardsCompat { + animateCrossFadeTransition(using: transitionContext) + return + } + toVC.dimmingView.isHidden = true let finalFrame = transitionContext.finalFrame(for: toVC) @@ -56,4 +65,22 @@ class SheetContainerPresentationAnimationController: NSObject, UIViewControllerA } + func animateCrossFadeTransition(using transitionContext: UIViewControllerContextTransitioning) { + guard let toVC = transitionContext.viewController(forKey: .to) as? SheetContainerViewController else { + fatalError() + } + + transitionContext.containerView.addSubview(toVC.view) + + toVC.view.alpha = 0 + + let duration = transitionDuration(using: transitionContext) + UIView.animate(withDuration: duration) { + toVC.view.alpha = 1 + } completion: { (finished) in + transitionContext.completeTransition(!transitionContext.transitionWasCancelled) + } + + } + } diff --git a/Sources/SheetController/UIAccessibility+BackwardsCompat.swift b/Sources/SheetController/UIAccessibility+BackwardsCompat.swift new file mode 100644 index 0000000..08b2b0b --- /dev/null +++ b/Sources/SheetController/UIAccessibility+BackwardsCompat.swift @@ -0,0 +1,18 @@ +// +// File.swift +// +// +// Created by Shadowfacts on 9/12/20. +// + +import UIKit + +extension UIAccessibility { + static var prefersCrossFadeTransitionsBackwardsCompat: Bool { + if #available(iOS 14.0, *) { + return prefersCrossFadeTransitions + } else { + return isReduceMotionEnabled + } + } +}