暫無描述

NavigationBarInteractivePopDeletegate.swift 2.4KB

    // // NavigationBarInteractivePopDeletegate.swift // PaiaiUIKit // // Created by ffib on 2019/1/15. // Copyright © 2019 yb. All rights reserved. // import Foundation public protocol NavigationBarInteractivePopDeletegate: class { func setupNavigationBarInteractivePopDelegate() } public extension NavigationBarInteractivePopDeletegate where Self: UIViewController & NavigationBarInOutAnimator { func setupNavigationBarInteractivePopDelegate() { guard let nav = navigationController else { return } nav.interactivePopGestureRecognizer?.addTarget(self, action: #selector(interactivePopAnimation(gesture:))) } } extension UIViewController { @objc func interactivePopAnimation(gesture: UIPanGestureRecognizer) { guard let `self` = self as? (NavigationBarInOutAnimator & UIViewController) else { return } let point = gesture.translation(in: view) let percentage = calculatePercentageOfOffsets(point: point) /// naivgationController == nil popped viewController /// navigationController?.visibleViewController == self pop to viewController let percentageAnimation: ((CGFloat) -> Void) let fadeInAnimation: (() -> Void) let fadeOutAnimation: (() -> Void) if navigationController == nil { percentageAnimation = self.navigationBarFadeOutWithPercentage fadeInAnimation = self.navigationBarFadeAndMoveIn fadeOutAnimation = self.navigationBarFadeAndMoveOut } else if navigationController?.visibleViewController == self { percentageAnimation = self.navigationBarFadeInWithPercentage fadeInAnimation = self.navigationBarFadeIn fadeOutAnimation = self.navigationBarFadeOut } else { return } percentageAnimation(percentage) guard gesture.state == .ended else { return } if (percentage > 0.5 && navigationController == nil) || (percentage < 0.5 && navigationController?.visibleViewController == self) { fadeOutAnimation() } else if (percentage < 0.5 && navigationController == nil) || (percentage > 0.5 && navigationController?.visibleViewController == self) { fadeInAnimation() } } private func calculatePercentageOfOffsets(point: CGPoint) -> CGFloat { return point.x / view.bounds.width } }