Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.08 KB | None | 0 0
  1. import UIKit
  2.  
  3. class CircularTransition: NSObject {
  4.  
  5. var circle = UIView()
  6.  
  7. var startingPoint = CGPoint.zero {
  8. didSet {
  9. circle.center = startingPoint
  10. }
  11. }
  12.  
  13. var circleColor = UIColor.white
  14.  
  15. var duration = 0.2
  16.  
  17. enum CircularTransitionMode:Int {
  18. case present, dismiss, pop
  19. }
  20.  
  21. var transitionMode:CircularTransitionMode = .present
  22.  
  23. }
  24.  
  25. extension CircularTransition:UIViewControllerAnimatedTransitioning {
  26. func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
  27. return duration
  28. }
  29.  
  30. func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
  31. let containerView = transitionContext.containerView
  32.  
  33. if transitionMode == .present {
  34. if let presentedView = transitionContext.view(forKey: UITransitionContextViewKey.to) {
  35. let viewCenter = presentedView.center
  36. let viewSize = presentedView.frame.size
  37.  
  38. circle = UIView()
  39.  
  40. circle.frame = frameForCircle(withViewCenter: viewCenter, size: viewSize, startPoint: startingPoint)
  41.  
  42. circle.layer.cornerRadius = circle.frame.size.height / 2
  43. circle.center = startingPoint
  44. circle.backgroundColor = circleColor
  45. circle.transform = CGAffineTransform(scaleX: 0.001, y: 0.001)
  46. containerView.addSubview(circle)
  47.  
  48.  
  49. presentedView.center = startingPoint
  50. presentedView.transform = CGAffineTransform(scaleX: 0.001, y: 0.001)
  51. presentedView.alpha = 0
  52. containerView.addSubview(presentedView)
  53.  
  54. UIView.animate(withDuration: duration, animations: {
  55. self.circle.transform = CGAffineTransform.identity
  56. presentedView.transform = CGAffineTransform.identity
  57. presentedView.alpha = 1
  58. presentedView.center = viewCenter
  59.  
  60. }, completion: { (success:Bool) in
  61. transitionContext.completeTransition(success)
  62. })
  63. }
  64.  
  65. }else{
  66. let transitionModeKey = (transitionMode == .pop) ? UITransitionContextViewKey.to : UITransitionContextViewKey.from
  67.  
  68. if let returningView = transitionContext.view(forKey: transitionModeKey) {
  69. let viewCenter = returningView.center
  70. let viewSize = returningView.frame.size
  71.  
  72.  
  73. circle.frame = frameForCircle(withViewCenter: viewCenter, size: viewSize, startPoint: startingPoint)
  74.  
  75. circle.layer.cornerRadius = circle.frame.size.height / 2
  76. circle.center = startingPoint
  77.  
  78. UIView.animate(withDuration: duration, animations: {
  79. self.circle.transform = CGAffineTransform(scaleX: 0.001, y: 0.001)
  80. returningView.transform = CGAffineTransform(scaleX: 0.001, y: 0.001)
  81. returningView.center = self.startingPoint
  82. returningView.alpha = 0
  83.  
  84. if self.transitionMode == .pop {
  85. containerView.insertSubview(returningView, belowSubview: returningView)
  86. containerView.insertSubview(self.circle, belowSubview: returningView)
  87. }
  88.  
  89.  
  90. }, completion: { (success:Bool) in
  91. returningView.center = viewCenter
  92. returningView.removeFromSuperview()
  93.  
  94. self.circle.removeFromSuperview()
  95.  
  96. transitionContext.completeTransition(success)
  97.  
  98. })
  99.  
  100. }
  101.  
  102.  
  103. }
  104.  
  105. }
  106.  
  107.  
  108.  
  109. func frameForCircle (withViewCenter viewCenter:CGPoint, size viewSize:CGSize, startPoint:CGPoint) -> CGRect {
  110. let xLength = fmax(startPoint.x, viewSize.width - startPoint.x)
  111. let yLength = fmax(startPoint.y, viewSize.height - startPoint.y)
  112.  
  113. let offestVector = sqrt(xLength * xLength + yLength * yLength) * 2
  114. let size = CGSize(width: offestVector, height: offestVector)
  115.  
  116. return CGRect(origin: CGPoint.zero, size: size)
  117.  
  118. }
  119.  
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement