Commit ca07d0c1 by Daniel Dahan

pr-938: An expansion on this PR to fix the lifecycle issues with transitions.

parent 68308add
## 2.12.7
* [pr-938](https://github.com/CosmicMind/Material/pull/938): An expansion on this PR to fix the lifecycle issues with transitions.
## 2.12.6 ## 2.12.6
* Fixed issue where TabBar.lineColor was incorrectly being updated. * Fixed issue where TabBar.lineColor was incorrectly being updated.
......
...@@ -108,9 +108,11 @@ fileprivate extension ChipBarController { ...@@ -108,9 +108,11 @@ fileprivate extension ChipBarController {
case .top: case .top:
container.frame.origin.y = p container.frame.origin.y = p
container.frame.size.height = y container.frame.size.height = y
case .bottom: case .bottom:
container.frame.origin.y = 0 container.frame.origin.y = 0
container.frame.size.height = y container.frame.size.height = y
case .hidden: case .hidden:
container.frame.origin.y = 0 container.frame.origin.y = 0
container.frame.size.height = view.bounds.height container.frame.size.height = view.bounds.height
...@@ -131,9 +133,11 @@ fileprivate extension ChipBarController { ...@@ -131,9 +133,11 @@ fileprivate extension ChipBarController {
case .top: case .top:
chipBar.isHidden = false chipBar.isHidden = false
chipBar.frame.origin.y = 0 chipBar.frame.origin.y = 0
case .bottom: case .bottom:
chipBar.isHidden = false chipBar.isHidden = false
chipBar.frame.origin.y = view.bounds.height - chipBar.bounds.height chipBar.frame.origin.y = view.bounds.height - chipBar.bounds.height
case .hidden: case .hidden:
chipBar.isHidden = true chipBar.isHidden = true
} }
......
...@@ -96,6 +96,7 @@ fileprivate extension SearchBarController { ...@@ -96,6 +96,7 @@ fileprivate extension SearchBarController {
case .top: case .top:
container.frame.origin.y = q + p container.frame.origin.y = q + p
container.frame.size.height = h container.frame.size.height = h
case .bottom: case .bottom:
container.frame.origin.y = q container.frame.origin.y = q
container.frame.size.height = h container.frame.size.height = h
......
...@@ -99,6 +99,7 @@ open class StatusBarController: TransitionController { ...@@ -99,6 +99,7 @@ open class StatusBarController: TransitionController {
let h = statusBar.bounds.height let h = statusBar.bounds.height
container.frame.origin.y = h container.frame.origin.y = h
container.frame.size.height = view.bounds.height - h container.frame.size.height = view.bounds.height - h
case .full: case .full:
container.frame = view.bounds container.frame = view.bounds
} }
......
...@@ -175,9 +175,9 @@ open class TabsController: TransitionController { ...@@ -175,9 +175,9 @@ open class TabsController: TransitionController {
view.backgroundColor = .white view.backgroundColor = .white
view.contentScaleFactor = Screen.scale view.contentScaleFactor = Screen.scale
prepareSelectedIndexViewController()
prepareTabBar() prepareTabBar()
prepareTabItems() prepareTabItems()
prepareSelectedIndexViewController()
} }
open override func transition(to viewController: UIViewController, completion: ((Bool) -> Void)?) { open override func transition(to viewController: UIViewController, completion: ((Bool) -> Void)?) {
...@@ -193,53 +193,40 @@ fileprivate extension TabsController { ...@@ -193,53 +193,40 @@ fileprivate extension TabsController {
- Parameter completion: An optional completion block. - Parameter completion: An optional completion block.
*/ */
func transition(to viewController: UIViewController, isTriggeredByUserInteraction: Bool, completion: ((Bool) -> Void)?) { func transition(to viewController: UIViewController, isTriggeredByUserInteraction: Bool, completion: ((Bool) -> Void)?) {
guard let fvc = rootViewController else { guard let fvcIndex = viewControllers.index(of: rootViewController) else {
return return
} }
guard let fvcIndex = viewControllers.index(of: fvc) else { guard let tvcIndex = viewControllers.index(of: viewController) else {
return
}
let tvc = viewController
guard let tvcIndex = viewControllers.index(of: tvc) else {
return return
} }
var isAuto = false var isAuto = false
switch tvc.motionModalTransitionType { switch viewController.motionModalTransitionType {
case .auto: case .auto:
isAuto = true isAuto = true
viewController.motionModalTransitionType = fvcIndex < tvcIndex ? .slide(direction: .left) : .slide(direction: .right) viewController.motionModalTransitionType = fvcIndex < tvcIndex ? .slide(direction: .left) : .slide(direction: .right)
default:break default:break
} }
prepare(viewController: tvc, in: container)
if isTriggeredByUserInteraction { if isTriggeredByUserInteraction {
delegate?.tabsController?(tabsController: self, willSelect: viewController) delegate?.tabsController?(tabsController: self, willSelect: viewController)
} }
view.isUserInteractionEnabled = false super.transition(to: viewController) { [weak self, isAuto = isAuto, viewController = viewController, completion = completion] (isFinished) in
Motion.shared.transition(from: fvc, to: viewController, in: container) { [weak self, tvc = tvc, isAuto = isAuto, completion = completion] (isFinished) in
guard let s = self else { guard let s = self else {
return return
} }
if isAuto { if isAuto {
tvc.motionModalTransitionType = .auto viewController.motionModalTransitionType = .auto
} }
s.rootViewController = tvc
s.view.isUserInteractionEnabled = true
completion?(isFinished) completion?(isFinished)
if isTriggeredByUserInteraction { if isTriggeredByUserInteraction {
s.delegate?.tabsController?(tabsController: s, didSelect: tvc) s.delegate?.tabsController?(tabsController: s, didSelect: viewController)
} }
} }
} }
......
...@@ -97,6 +97,7 @@ fileprivate extension ToolbarController { ...@@ -97,6 +97,7 @@ fileprivate extension ToolbarController {
case .top: case .top:
container.frame.origin.y = q + p container.frame.origin.y = q + p
container.frame.size.height = h container.frame.size.height = h
case .bottom: case .bottom:
container.frame.origin.y = q container.frame.origin.y = q
container.frame.size.height = h container.frame.size.height = h
......
...@@ -58,18 +58,25 @@ open class TransitionController: UIViewController { ...@@ -58,18 +58,25 @@ open class TransitionController: UIViewController {
*/ */
open internal(set) var rootViewController: UIViewController! { open internal(set) var rootViewController: UIViewController! {
willSet { willSet {
if let v = rootViewController { guard newValue != rootViewController else {
removeViewController(viewController: v) return
}
guard let v = rootViewController else {
return
} }
removeViewController(viewController: v)
} }
didSet { didSet {
guard oldValue != rootViewController else {
return
}
prepare(viewController: rootViewController, in: container) prepare(viewController: rootViewController, in: container)
} }
} }
/// The transition type used during a transition.
open var motionTransitionType = MotionTransitionType.fade
/** /**
An initializer that initializes the object with a NSCoder object. An initializer that initializes the object with a NSCoder object.
- Parameter aDecoder: A NSCoder instance. - Parameter aDecoder: A NSCoder instance.
...@@ -119,23 +126,15 @@ open class TransitionController: UIViewController { ...@@ -119,23 +126,15 @@ open class TransitionController: UIViewController {
to the toViewController has completed. to the toViewController has completed.
*/ */
open func transition(to viewController: UIViewController, completion: ((Bool) -> Void)? = nil) { open func transition(to viewController: UIViewController, completion: ((Bool) -> Void)? = nil) {
guard let fvc = rootViewController else { prepare(viewController: viewController, in: container)
return
}
let tvc = viewController
tvc.view.isHidden = false
tvc.view.frame = container.bounds
tvc.motionModalTransitionType = motionTransitionType
view.isUserInteractionEnabled = false view.isUserInteractionEnabled = false
Motion.shared.transition(from: fvc, to: tvc, in: container) { [weak self, tvc = tvc, completion = completion] (isFinished) in Motion.shared.transition(from: rootViewController, to: viewController, in: container) { [weak self, viewController = viewController, completion = completion] (isFinished) in
guard let s = self else { guard let s = self else {
return return
} }
s.rootViewController = tvc s.rootViewController = viewController
s.view.isUserInteractionEnabled = true s.view.isUserInteractionEnabled = true
completion?(isFinished) completion?(isFinished)
} }
...@@ -161,6 +160,7 @@ open class TransitionController: UIViewController { ...@@ -161,6 +160,7 @@ open class TransitionController: UIViewController {
view.contentScaleFactor = Screen.scale view.contentScaleFactor = Screen.scale
prepareContainer() prepareContainer()
prepare(viewController: rootViewController, in: container)
} }
} }
......
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