Commit 1c8b3c46 by Orkhan Alikhanov

Fixed overridden delegates were not forwarded

parent 2f4fb285
...@@ -48,8 +48,7 @@ extension MotionTransition { ...@@ -48,8 +48,7 @@ extension MotionTransition {
transitionContext = nil transitionContext = nil
fromViewController = nil fromViewController = nil
toViewController = nil toViewController = nil
isNavigationController = false transitioningViewController = nil
isTabBarController = false
forceNonInteractive = false forceNonInteractive = false
animatingToViews.removeAll() animatingToViews.removeAll()
animatingFromViews.removeAll() animatingFromViews.removeAll()
......
...@@ -38,7 +38,7 @@ extension MotionTransition: UINavigationControllerDelegate { ...@@ -38,7 +38,7 @@ extension MotionTransition: UINavigationControllerDelegate {
isPresenting = .push == operation isPresenting = .push == operation
fromViewController = fromViewController ?? fromVC fromViewController = fromViewController ?? fromVC
toViewController = toViewController ?? toVC toViewController = toViewController ?? toVC
isNavigationController = true transitioningViewController = navigationController
return self return self
} }
......
...@@ -30,6 +30,11 @@ import UIKit ...@@ -30,6 +30,11 @@ import UIKit
extension MotionTransition: UITabBarControllerDelegate { extension MotionTransition: UITabBarControllerDelegate {
public func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { public func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
guard false != tabBarController.previousTabBarDelegate?.tabBarController?(tabBarController, shouldSelect: viewController) else {
return false
}
if isTransitioning { if isTransitioning {
cancel(isAnimated: false) cancel(isAnimated: false)
} }
...@@ -54,7 +59,7 @@ extension MotionTransition: UITabBarControllerDelegate { ...@@ -54,7 +59,7 @@ extension MotionTransition: UITabBarControllerDelegate {
isPresenting = toVCIndex > fromVCIndex isPresenting = toVCIndex > fromVCIndex
fromViewController = fromViewController ?? fromVC fromViewController = fromViewController ?? fromVC
toViewController = toViewController ?? toVC toViewController = toViewController ?? toVC
isTabBarController = true transitioningViewController = tabBarController
return self return self
} }
......
...@@ -377,11 +377,18 @@ open class MotionTransition: NSObject { ...@@ -377,11 +377,18 @@ open class MotionTransition: NSObject {
internal var forceFinishing: Bool? internal var forceFinishing: Bool?
internal var startingProgress: TimeInterval? internal var startingProgress: TimeInterval?
/// A weak reference to the currently transitioning view controller.
internal weak var transitioningViewController: UIViewController?
/// Indicates whether a UINavigationController is transitioning. /// Indicates whether a UINavigationController is transitioning.
internal var isNavigationController = false internal var isNavigationController: Bool {
return transitioningViewController is UINavigationController
}
/// Indicates whether a UITabBarController is transitioning. /// 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. /// Indicates whether a UINavigationController or UITabBarController is transitioning.
internal var isContainerController: Bool { internal var isContainerController: Bool {
...@@ -423,6 +430,41 @@ open class MotionTransition: NSObject { ...@@ -423,6 +430,41 @@ open class MotionTransition: NSObject {
progressRunner.start(progress: progress * duration, duration: duration, isReversed: !isFinishing) 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 { 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