FadeAnimator.swift 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //
  2. // Created by Jake Lin on 2/27/16.
  3. // Copyright © 2016 IBAnimatable. All rights reserved.
  4. //
  5. import UIKit
  6. public class FadeAnimator: NSObject, AnimatedTransitioning {
  7. // MARK: - AnimatorProtocol
  8. public var transitionAnimationType: TransitionAnimationType = .fade(direction: .cross)
  9. public var transitionDuration: Duration = defaultTransitionDuration
  10. public var reverseAnimationType: TransitionAnimationType? = .fade(direction: .cross)
  11. public var interactiveGestureType: InteractiveGestureType? = .pan(from: .horizontal)
  12. // MARK: - private
  13. fileprivate var direction: TransitionAnimationType.Direction
  14. public init(direction: TransitionAnimationType.Direction, duration: Duration) {
  15. self.direction = direction
  16. transitionDuration = duration
  17. transitionAnimationType = .fade(direction: direction)
  18. reverseAnimationType = .fade(direction: direction.opposite)
  19. super.init()
  20. }
  21. }
  22. extension FadeAnimator: UIViewControllerAnimatedTransitioning {
  23. public func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
  24. return retrieveTransitionDuration(transitionContext: transitionContext)
  25. }
  26. public func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
  27. let (tempfromView, tempToView, tempContainerView) = retrieveViews(transitionContext: transitionContext)
  28. guard let fromView = tempfromView, let toView = tempToView, let containerView = tempContainerView else {
  29. transitionContext.completeTransition(true)
  30. return
  31. }
  32. let (_, tempToViewController, _) = retrieveViewControllers(transitionContext: transitionContext)
  33. if let toViewController = tempToViewController {
  34. toView.frame = transitionContext.finalFrame(for: toViewController)
  35. }
  36. switch direction {
  37. case .in:
  38. toView.alpha = 0
  39. containerView.addSubview(toView)
  40. case .out:
  41. containerView.insertSubview(toView, belowSubview: fromView)
  42. default:
  43. toView.alpha = 0
  44. containerView.addSubview(toView)
  45. }
  46. UIView.animate(
  47. withDuration: transitionDuration(using: transitionContext),
  48. animations: {
  49. switch self.direction {
  50. case .in:
  51. toView.alpha = 1
  52. case .out:
  53. fromView.alpha = 0
  54. default:
  55. fromView.alpha = 0
  56. toView.alpha = 1
  57. }
  58. },
  59. completion: { _ in
  60. transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
  61. }
  62. )
  63. }
  64. }