ViewControllerAnimatedTransitioning.swift 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. //
  2. // ViewControllerAnimatedTransitioning.swift
  3. // Mastodon
  4. //
  5. // Created by MainasuK Cirno on 2021-4-28.
  6. //
  7. import os.log
  8. import UIKit
  9. protocol ViewControllerAnimatedTransitioningDelegate: AnyObject {
  10. var wantsInteractiveStart: Bool { get }
  11. func animationEnded(_ transitionCompleted: Bool)
  12. }
  13. class ViewControllerAnimatedTransitioning: NSObject {
  14. let operation: UINavigationController.Operation
  15. var transitionDuration: TimeInterval
  16. var transitionContext: UIViewControllerContextTransitioning!
  17. var isInteractive: Bool { return transitionContext.isInteractive }
  18. weak var delegate: ViewControllerAnimatedTransitioningDelegate?
  19. init(operation: UINavigationController.Operation) {
  20. assert(operation != .none)
  21. self.operation = operation
  22. self.transitionDuration = 0.3
  23. super.init()
  24. }
  25. deinit {
  26. os_log("%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function)
  27. }
  28. }
  29. // MARK: - UIViewControllerAnimatedTransitioning
  30. extension ViewControllerAnimatedTransitioning: UIViewControllerAnimatedTransitioning {
  31. func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
  32. return transitionDuration
  33. }
  34. func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
  35. self.transitionContext = transitionContext
  36. }
  37. func animationEnded(_ transitionCompleted: Bool) {
  38. delegate?.animationEnded(transitionCompleted)
  39. }
  40. }
  41. // MARK: - UIViewControllerInteractiveTransitioning
  42. extension ViewControllerAnimatedTransitioning: UIViewControllerInteractiveTransitioning {
  43. func startInteractiveTransition(_ transitionContext: UIViewControllerContextTransitioning) {
  44. self.transitionContext = transitionContext
  45. }
  46. var wantsInteractiveStart: Bool {
  47. return delegate?.wantsInteractiveStart ?? false
  48. }
  49. }