Extensions.swift 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //
  2. // Extensions.swift
  3. // Pods-Example
  4. //
  5. // Created by Jon Kent on 7/1/19.
  6. //
  7. import UIKit
  8. extension NSObject: InitializableClass {}
  9. internal extension UIView {
  10. @discardableResult func untransformed(_ block: () -> CGFloat) -> CGFloat {
  11. let t = transform
  12. transform = .identity
  13. let value = block()
  14. transform = t
  15. return value
  16. }
  17. func bringToFront() {
  18. superview?.bringSubviewToFront(self)
  19. }
  20. func untransform(_ block: () -> Void) {
  21. untransformed { () -> CGFloat in
  22. block()
  23. return 0
  24. }
  25. }
  26. static func animationsEnabled(_ enabled: Bool = true, _ block: () -> Void) {
  27. let a = areAnimationsEnabled
  28. setAnimationsEnabled(enabled)
  29. block()
  30. setAnimationsEnabled(a)
  31. }
  32. }
  33. internal extension UIViewController {
  34. // View controller actively displayed in that layer. It may not be visible if it's presenting another view controller.
  35. var activeViewController: UIViewController {
  36. switch self {
  37. case let navigationController as UINavigationController:
  38. return navigationController.topViewController?.activeViewController ?? self
  39. case let tabBarController as UITabBarController:
  40. return tabBarController.selectedViewController?.activeViewController ?? self
  41. case let splitViewController as UISplitViewController:
  42. return splitViewController.viewControllers.last?.activeViewController ?? self
  43. default:
  44. return self
  45. }
  46. }
  47. // View controller being displayed on screen to the user.
  48. var topMostViewController: UIViewController {
  49. let activeViewController = self.activeViewController
  50. return activeViewController.presentedViewController?.topMostViewController ?? activeViewController
  51. }
  52. var containerViewController: UIViewController {
  53. return navigationController?.containerViewController ??
  54. tabBarController?.containerViewController ??
  55. splitViewController?.containerViewController ??
  56. self
  57. }
  58. @objc var isHidden: Bool {
  59. return presentingViewController == nil
  60. }
  61. }
  62. internal extension UIGestureRecognizer {
  63. convenience init(addTo view: UIView, target: Any, action: Selector) {
  64. self.init(target: target, action: action)
  65. view.addGestureRecognizer(self)
  66. }
  67. convenience init?(addTo view: UIView?, target: Any, action: Selector) {
  68. guard let view = view else { return nil }
  69. self.init(addTo: view, target: target, action: action)
  70. }
  71. func remove() {
  72. view?.removeGestureRecognizer(self)
  73. }
  74. }
  75. internal extension UIPanGestureRecognizer {
  76. var canSwitch: Bool {
  77. return !(self is UIScreenEdgePanGestureRecognizer)
  78. }
  79. var xTranslation: CGFloat {
  80. return view?.untransformed {
  81. return self.translation(in: view).x
  82. } ?? 0
  83. }
  84. var xVelocity: CGFloat {
  85. return view?.untransformed {
  86. return self.velocity(in: view).x
  87. } ?? 0
  88. }
  89. }
  90. internal extension UIApplication {
  91. var keyWindow: UIWindow? {
  92. return UIApplication.shared.windows.filter { $0.isKeyWindow }.first
  93. }
  94. }