Skip to content

Instantly share code, notes, and snippets.

@sonjh1217
Last active April 28, 2021 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sonjh1217/c4433264ba288ff204203b7edaf91106 to your computer and use it in GitHub Desktop.
Save sonjh1217/c4433264ba288ff204203b7edaf91106 to your computer and use it in GitHub Desktop.
Interactive Transition
class ChromecastExpandedViewController: UIViewController {
private var dismissInteractiveTransition = InteracitveTransition()
override func viewDidLoad() {
super.viewDidLoad()
addPanGestureRecognizer()
}
}
extension ChromecastExpandedViewController {
override func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
return dismissInteractiveTransition.hasStarted ? dismissInteractiveTransition : nil
}
private func addPanGestureRecognizer() {
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(dismissIfPanDownward(sender:)))
panGestureRecognizer.maximumNumberOfTouches = 1
view.addGestureRecognizer(panGestureRecognizer)
}
@objc private func dismissIfPanDownward(sender: UIPanGestureRecognizer) {
let progressThreshold:CGFloat = 0.3
let progress = dismissProgress(of: sender)
switch sender.state {
case .began:
dismissInteractiveTransition.hasStarted = true
dismiss(animated: true, completion: nil)
case .changed:
dismissInteractiveTransition.shouldFinish = progress > progressThreshold
dismissInteractiveTransition.update(progress)
case .cancelled:
dismissInteractiveTransition.hasStarted = false
dismissInteractiveTransition.cancel()
case .ended:
dismissInteractiveTransition.hasStarted = false
dismissInteractiveTransition.shouldFinish
? dismissInteractiveTransition.finish()
: dismissInteractiveTransition.cancel()
default:
break
}
}
private func dismissProgress(of gestureRecognizer:UIPanGestureRecognizer) -> CGFloat {
let touchPoint = gestureRecognizer.translation(in: gestureRecognizer.view)
var downwardMovement = Float(touchPoint.y / view.bounds.height)
downwardMovement = fmaxf(downwardMovement, 0.0)
downwardMovement = fminf(downwardMovement, 1.0)
let progress = CGFloat(downwardMovement)
return progress
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment