Commit 0b4833dd by Daniel Dahan Committed by GitHub

Merge pull request #40 from OrkhanAlikhanov/forwarding-delegates

Fixed overridden delegates were not forwarded
parents 2f4fb285 1c8b3c46
......@@ -48,8 +48,7 @@ extension MotionTransition {
transitionContext = nil
fromViewController = nil
toViewController = nil
isNavigationController = false
isTabBarController = false
transitioningViewController = nil
forceNonInteractive = false
animatingToViews.removeAll()
animatingFromViews.removeAll()
......
......@@ -38,7 +38,7 @@ extension MotionTransition: UINavigationControllerDelegate {
isPresenting = .push == operation
fromViewController = fromViewController ?? fromVC
toViewController = toViewController ?? toVC
isNavigationController = true
transitioningViewController = navigationController
return self
}
......
......@@ -30,6 +30,11 @@ import UIKit
extension MotionTransition: UITabBarControllerDelegate {
public func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
guard false != tabBarController.previousTabBarDelegate?.tabBarController?(tabBarController, shouldSelect: viewController) else {
return false
}
if isTransitioning {
cancel(isAnimated: false)
}
......@@ -54,7 +59,7 @@ extension MotionTransition: UITabBarControllerDelegate {
isPresenting = toVCIndex > fromVCIndex
fromViewController = fromViewController ?? fromVC
toViewController = toViewController ?? toVC
isTabBarController = true
transitioningViewController = tabBarController
return self
}
......
......@@ -377,11 +377,18 @@ open class MotionTransition: NSObject {
internal var forceFinishing: Bool?
internal var startingProgress: TimeInterval?
/// A weak reference to the currently transitioning view controller.
internal weak var transitioningViewController: UIViewController?
/// Indicates whether a UINavigationController is transitioning.
internal var isNavigationController = false
internal var isNavigationController: Bool {
return transitioningViewController is UINavigationController
}
/// Indicates whether a UITabBarController is transitioning.
internal var isTabBarController = false
internal var isTabBarController: Bool {
return transitioningViewController is UITabBarController
}
/// Indicates whether a UINavigationController or UITabBarController is transitioning.
internal var isContainerController: Bool {
......@@ -423,6 +430,41 @@ open class MotionTransition: NSObject {
progressRunner.start(progress: progress * duration, duration: duration, isReversed: !isFinishing)
}
private func delegate(respondingTo selector: Selector?) -> NSObjectProtocol? {
guard let selector = selector else { return nil }
/// Workaround for recursion happening during navigationController transtion.
/// Avoiding private selectors (e.g _shouldCrossFadeBottomBars)
guard !selector.description.starts(with: "_") else { return nil }
/// Get relevant delegate according to controller type
let delegate: NSObjectProtocol? = {
if isTabBarController {
return transitioningViewController?.previousTabBarDelegate
}
if isNavigationController {
return transitioningViewController?.previousNavigationDelegate
}
return nil
}()
return true == delegate?.responds(to: selector) ? delegate : nil
}
open override func forwardingTarget(for aSelector: Selector!) -> Any? {
guard let superTarget = super.forwardingTarget(for: aSelector) else {
return delegate(respondingTo: aSelector)
}
return superTarget
}
open override func responds(to aSelector: Selector!) -> Bool {
return super.responds(to: aSelector) || nil != delegate(respondingTo: aSelector)
}
}
extension MotionTransition: MotionProgressRunnerDelegate {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment