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