123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- import UIKit
- public class NavigationController: UINavigationController {
-
- override public init(rootViewController: UIViewController) {
- super.init(navigationBarClass: NavigationBar.classForCoder(), toolbarClass: nil)
- self.viewControllers = [rootViewController]
- }
-
- required init?(coder aDecoder: NSCoder) {
- super.init(coder: aDecoder)
- }
-
- override public init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
- super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
- }
-
- override public func viewDidLoad() {
- super.viewDidLoad()
- delegate = self
- interactivePopGestureRecognizer?.delegate = self
- interactivePopGestureRecognizer?.isEnabled = true
-
-
- interactivePopGestureRecognizer?.addTarget(self,
- action: #selector(handlePop(gestureRecognizer:)))
- }
-
- @objc
- private func handlePop(gestureRecognizer: UIPanGestureRecognizer) {
- guard let navBar = navigationBar as? NavigationBar else { return }
- if gestureRecognizer.state == .began { navBar.isPush = false }
-
- guard navBar.needsInteractive else { return }
-
- let percent = gestureRecognizer.translation(in: view).x / view.bounds.width
-
- if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
- navBar.transitionAnimationWithPercent(percent)
- }
-
- guard gestureRecognizer.state == .ended
- || gestureRecognizer.state == .cancelled
- || gestureRecognizer.state == .failed,
- let coordinator = transitionCoordinator else { return }
-
- navBar.bounce = percent < 0.5 ? .backward : .forward
- let durationPercent = Double(percent < 0.5 ? coordinator.percentComplete : (1 - coordinator.percentComplete))
- UIView.animate(withDuration: coordinator.transitionDuration * durationPercent, delay: 0, usingSpringWithDamping: 1,
- initialSpringVelocity: coordinator.completionVelocity, options: [], animations: {
- navBar.transitionAnimationWithPercent(1)
- }) { _ in
- navBar.clear()
- }
- }
- }
- extension NavigationController: UINavigationControllerDelegate {
-
- public func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
- (navigationBar as? NavigationBar)?.isPush = operation == .push
- return nil
- }
-
- public func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
- guard let navBar = navigationBar as? NavigationBar,
- navBar.needsInteractive else { return }
-
- guard let coordinator = transitionCoordinator,
- animated else {
- navBar.setBackgroundImage()
- navBar.clear()
- return
- }
-
- navBar.constructViewHierarchy()
-
- guard !coordinator.isInteractive else { return }
-
- coordinator.animate(alongsideTransition: { (transitionContext) in
- DispatchQueue.main.async {
- UIView.beginAnimations(nil, context: nil)
- UIView.setAnimationCurve(transitionContext.completionCurve)
- UIView.setAnimationDuration(transitionContext.transitionDuration)
- navBar.transitionAnimation()
- UIView.commitAnimations()
- }
- }, completion: { (transitionContext) in
- navBar.clear()
- })
- }
- }
- extension NavigationController: UIGestureRecognizerDelegate {
- public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
- if gestureRecognizer == interactivePopGestureRecognizer {
- return viewControllers.count > 1
- }
- return true
- }
- }
|