|
//
// 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
}
}
|