Commit 9f0421f4 by Daniel Dahan

added UINavigationController MotionTransition

parent 9bbf1f09
...@@ -45,7 +45,7 @@ fileprivate struct MotionInstanceController { ...@@ -45,7 +45,7 @@ fileprivate struct MotionInstanceController {
extension UIViewController: UIViewControllerTransitioningDelegate { extension UIViewController: UIViewControllerTransitioningDelegate {
/// MotionInstanceController Reference. /// MotionInstanceController Reference.
fileprivate var motion: MotionInstanceController { fileprivate var motionInstanceController: MotionInstanceController {
get { get {
return AssociatedObject(base: self, key: &MotionInstanceControllerKey) { return AssociatedObject(base: self, key: &MotionInstanceControllerKey) {
return MotionInstanceController(isEnabled: false, delegate: nil) return MotionInstanceController(isEnabled: false, delegate: nil)
...@@ -58,7 +58,7 @@ extension UIViewController: UIViewControllerTransitioningDelegate { ...@@ -58,7 +58,7 @@ extension UIViewController: UIViewControllerTransitioningDelegate {
open var isMotionEnabled: Bool { open var isMotionEnabled: Bool {
get { get {
return motion.isEnabled return motionInstanceController.isEnabled
} }
set(value) { set(value) {
if value { if value {
...@@ -66,16 +66,16 @@ extension UIViewController: UIViewControllerTransitioningDelegate { ...@@ -66,16 +66,16 @@ extension UIViewController: UIViewControllerTransitioningDelegate {
transitioningDelegate = self transitioningDelegate = self
} }
motion.isEnabled = value motionInstanceController.isEnabled = value
} }
} }
open weak var motionDelegate: MotionDelegate? { open weak var motionDelegate: MotionDelegate? {
get { get {
return motion.delegate return motionInstanceController.delegate
} }
set(value) { set(value) {
motion.delegate = value motionInstanceController.delegate = value
} }
} }
} }
...@@ -131,15 +131,23 @@ extension UIView { ...@@ -131,15 +131,23 @@ extension UIView {
let oldCornerRadius = cornerRadius let oldCornerRadius = cornerRadius
cornerRadius = 0 cornerRadius = 0
let oldBackgroundColor = backgroundColor var oldBackgroundColor: UIColor?
backgroundColor = .clear
if shouldHide {
oldBackgroundColor = backgroundColor
backgroundColor = .clear
}
let oldTransform = motionTransform let oldTransform = motionTransform
motionTransform = CATransform3DIdentity motionTransform = CATransform3DIdentity
let v = snapshotView(afterScreenUpdates: afterUpdates)! let v = snapshotView(afterScreenUpdates: afterUpdates)!
cornerRadius = oldCornerRadius cornerRadius = oldCornerRadius
backgroundColor = oldBackgroundColor
if shouldHide {
backgroundColor = oldBackgroundColor
}
motionTransform = oldTransform motionTransform = oldTransform
let contentView = v.subviews.first! let contentView = v.subviews.first!
...@@ -212,10 +220,13 @@ open class MotionTransitionPresentationController: UIPresentationController { ...@@ -212,10 +220,13 @@ open class MotionTransitionPresentationController: UIPresentationController {
@objc(MotionDelegate) @objc(MotionDelegate)
public protocol MotionDelegate { public protocol MotionDelegate {
@objc @objc
optional func motion(transition: MotionTransition, willTransition toView: UIView, fromView: UIView) optional func motion(transition: MotionTransition, willTransition fromView: UIView, toView: UIView)
@objc
optional func motion(transition: MotionTransition, didTransition fromView: UIView, toView: UIView)
@objc @objc
optional func motion(transition: MotionTransition, didTransition toView: UIView, fromView: UIView) optional func motionModifyDelay(transition: MotionTransition) -> TimeInterval
} }
open class MotionTransition: NSObject { open class MotionTransition: NSObject {
...@@ -239,6 +250,10 @@ open class MotionTransition: NSObject { ...@@ -239,6 +250,10 @@ open class MotionTransition: NSObject {
open var containerView: UIView! open var containerView: UIView!
open var transitionView = UIView() open var transitionView = UIView()
fileprivate var modifiedDelay: TimeInterval {
return fromViewController?.motionDelegate?.motionModifyDelay?(transition: self) ?? 0
}
public override init() { public override init() {
isPresenting = false isPresenting = false
super.init() super.init()
...@@ -281,20 +296,46 @@ open class MotionTransition: NSObject { ...@@ -281,20 +296,46 @@ open class MotionTransition: NSObject {
} }
} }
extension UINavigationController: UINavigationControllerDelegate {
open override func viewDidLoad() {
super.viewDidLoad()
delegate = self
}
@objc(navigationController:animationControllerForOperation:fromViewController:toViewController:)
open func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return isMotionEnabled ? MotionTransition(isPresenting: operation == .push) : nil
}
}
extension UITabBarController: UITabBarControllerDelegate {
open func tabBarController(_ tabBarController: UITabBarController, animationControllerForTransitionFrom fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return isMotionEnabled ? MotionTransition() : nil
}
}
extension MotionTransition: UIViewControllerAnimatedTransitioning { extension MotionTransition: UIViewControllerAnimatedTransitioning {
@objc(animateTransition:) @objc(animateTransition:)
open func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { open func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
self.transitionContext = transitionContext self.transitionContext = transitionContext
prepareToViewController() prepareToViewController()
prepareFromViewController() prepareFromViewController()
prepareContainerView()
prepareTransitionSnapshot() fromViewController.motionDelegate?.motion?(transition: self, willTransition: fromView, toView: toView)
prepareTransitionPairs()
prepareTransitionView() Motion.delay(modifiedDelay) { [weak self] in
prepareTransitionBackgroundView() guard let s = self else {
prepareTransitionToView() return
prepareTransitionAnimation() }
s.prepareContainerView()
s.prepareTransitionSnapshot()
s.prepareTransitionPairs()
s.prepareTransitionView()
s.prepareTransitionBackgroundView()
s.prepareTransitionToView()
s.prepareTransitionAnimation()
}
} }
@objc(transitionDuration:) @objc(transitionDuration:)
...@@ -390,8 +431,6 @@ extension MotionTransition { ...@@ -390,8 +431,6 @@ extension MotionTransition {
let d = motionDuration(animations: to.motionAnimations) let d = motionDuration(animations: to.motionAnimations)
fromViewController.motionDelegate?.motion?(transition: self, willTransition: toView, fromView: fromView)
let snapshot = from.motionSnapshot(afterUpdates: true) let snapshot = from.motionSnapshot(afterUpdates: true)
transitionView.addSubview(snapshot) transitionView.addSubview(snapshot)
...@@ -473,7 +512,7 @@ extension MotionTransition { ...@@ -473,7 +512,7 @@ extension MotionTransition {
extension MotionTransition { extension MotionTransition {
fileprivate func cleanupAnimation() { fileprivate func cleanupAnimation() {
Motion.delay(transitionDuration(using: transitionContext)) { [weak self] in Motion.delay(transitionDuration(using: transitionContext) + modifiedDelay) { [weak self] in
guard let s = self else { guard let s = self else {
return return
} }
...@@ -510,7 +549,7 @@ extension MotionTransition { ...@@ -510,7 +549,7 @@ extension MotionTransition {
} }
fileprivate func completeTransition() { fileprivate func completeTransition() {
fromViewController.motionDelegate?.motion?(transition: self, didTransition: toView, fromView: fromView) toViewController.motionDelegate?.motion?(transition: self, didTransition: fromView, toView: toView)
transitionContext.completeTransition(!transitionContext.transitionWasCancelled) transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
} }
} }
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