Skip to content

Commit ca07d0c

Browse files
author
Daniel Dahan
committed
pr-938: An expansion on this PR to fix the lifecycle issues with transitions.
1 parent 68308ad commit ca07d0c

7 files changed

+34
-36
lines changed

Diff for: CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.12.7
2+
3+
* [pr-938](https://github.com/CosmicMind/Material/pull/938): An expansion on this PR to fix the lifecycle issues with transitions.
4+
15
## 2.12.6
26

37
* Fixed issue where TabBar.lineColor was incorrectly being updated.

Diff for: Sources/iOS/ChipBarController.swift

+4
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,11 @@ fileprivate extension ChipBarController {
108108
case .top:
109109
container.frame.origin.y = p
110110
container.frame.size.height = y
111+
111112
case .bottom:
112113
container.frame.origin.y = 0
113114
container.frame.size.height = y
115+
114116
case .hidden:
115117
container.frame.origin.y = 0
116118
container.frame.size.height = view.bounds.height
@@ -131,9 +133,11 @@ fileprivate extension ChipBarController {
131133
case .top:
132134
chipBar.isHidden = false
133135
chipBar.frame.origin.y = 0
136+
134137
case .bottom:
135138
chipBar.isHidden = false
136139
chipBar.frame.origin.y = view.bounds.height - chipBar.bounds.height
140+
137141
case .hidden:
138142
chipBar.isHidden = true
139143
}

Diff for: Sources/iOS/SearchBarController.swift

+1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ fileprivate extension SearchBarController {
9696
case .top:
9797
container.frame.origin.y = q + p
9898
container.frame.size.height = h
99+
99100
case .bottom:
100101
container.frame.origin.y = q
101102
container.frame.size.height = h

Diff for: Sources/iOS/StatusBarController.swift

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ open class StatusBarController: TransitionController {
9999
let h = statusBar.bounds.height
100100
container.frame.origin.y = h
101101
container.frame.size.height = view.bounds.height - h
102+
102103
case .full:
103104
container.frame = view.bounds
104105
}

Diff for: Sources/iOS/TabsController.swift

+7-20
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,9 @@ open class TabsController: TransitionController {
175175
view.backgroundColor = .white
176176
view.contentScaleFactor = Screen.scale
177177

178-
prepareSelectedIndexViewController()
179178
prepareTabBar()
180179
prepareTabItems()
180+
prepareSelectedIndexViewController()
181181
}
182182

183183
open override func transition(to viewController: UIViewController, completion: ((Bool) -> Void)?) {
@@ -193,53 +193,40 @@ fileprivate extension TabsController {
193193
- Parameter completion: An optional completion block.
194194
*/
195195
func transition(to viewController: UIViewController, isTriggeredByUserInteraction: Bool, completion: ((Bool) -> Void)?) {
196-
guard let fvc = rootViewController else {
197-
return
198-
}
199-
200-
guard let fvcIndex = viewControllers.index(of: fvc) else {
196+
guard let fvcIndex = viewControllers.index(of: rootViewController) else {
201197
return
202198
}
203199

204-
let tvc = viewController
205-
206-
guard let tvcIndex = viewControllers.index(of: tvc) else {
200+
guard let tvcIndex = viewControllers.index(of: viewController) else {
207201
return
208202
}
209203

210204
var isAuto = false
211205

212-
switch tvc.motionModalTransitionType {
206+
switch viewController.motionModalTransitionType {
213207
case .auto:
214208
isAuto = true
215209
viewController.motionModalTransitionType = fvcIndex < tvcIndex ? .slide(direction: .left) : .slide(direction: .right)
216210
default:break
217211
}
218212

219-
prepare(viewController: tvc, in: container)
220-
221213
if isTriggeredByUserInteraction {
222214
delegate?.tabsController?(tabsController: self, willSelect: viewController)
223215
}
224216

225-
view.isUserInteractionEnabled = false
226-
227-
Motion.shared.transition(from: fvc, to: viewController, in: container) { [weak self, tvc = tvc, isAuto = isAuto, completion = completion] (isFinished) in
217+
super.transition(to: viewController) { [weak self, isAuto = isAuto, viewController = viewController, completion = completion] (isFinished) in
228218
guard let s = self else {
229219
return
230220
}
231221

232222
if isAuto {
233-
tvc.motionModalTransitionType = .auto
223+
viewController.motionModalTransitionType = .auto
234224
}
235225

236-
s.rootViewController = tvc
237-
s.view.isUserInteractionEnabled = true
238-
239226
completion?(isFinished)
240227

241228
if isTriggeredByUserInteraction {
242-
s.delegate?.tabsController?(tabsController: s, didSelect: tvc)
229+
s.delegate?.tabsController?(tabsController: s, didSelect: viewController)
243230
}
244231
}
245232
}

Diff for: Sources/iOS/ToolbarController.swift

+1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ fileprivate extension ToolbarController {
9797
case .top:
9898
container.frame.origin.y = q + p
9999
container.frame.size.height = h
100+
100101
case .bottom:
101102
container.frame.origin.y = q
102103
container.frame.size.height = h

Diff for: Sources/iOS/TransitionController.swift

+16-16
Original file line numberDiff line numberDiff line change
@@ -58,18 +58,25 @@ open class TransitionController: UIViewController {
5858
*/
5959
open internal(set) var rootViewController: UIViewController! {
6060
willSet {
61-
if let v = rootViewController {
62-
removeViewController(viewController: v)
61+
guard newValue != rootViewController else {
62+
return
63+
}
64+
65+
guard let v = rootViewController else {
66+
return
6367
}
68+
69+
removeViewController(viewController: v)
6470
}
6571
didSet {
72+
guard oldValue != rootViewController else {
73+
return
74+
}
75+
6676
prepare(viewController: rootViewController, in: container)
6777
}
6878
}
6979

70-
/// The transition type used during a transition.
71-
open var motionTransitionType = MotionTransitionType.fade
72-
7380
/**
7481
An initializer that initializes the object with a NSCoder object.
7582
- Parameter aDecoder: A NSCoder instance.
@@ -119,23 +126,15 @@ open class TransitionController: UIViewController {
119126
to the toViewController has completed.
120127
*/
121128
open func transition(to viewController: UIViewController, completion: ((Bool) -> Void)? = nil) {
122-
guard let fvc = rootViewController else {
123-
return
124-
}
125-
126-
let tvc = viewController
127-
128-
tvc.view.isHidden = false
129-
tvc.view.frame = container.bounds
130-
tvc.motionModalTransitionType = motionTransitionType
129+
prepare(viewController: viewController, in: container)
131130

132131
view.isUserInteractionEnabled = false
133-
Motion.shared.transition(from: fvc, to: tvc, in: container) { [weak self, tvc = tvc, completion = completion] (isFinished) in
132+
Motion.shared.transition(from: rootViewController, to: viewController, in: container) { [weak self, viewController = viewController, completion = completion] (isFinished) in
134133
guard let s = self else {
135134
return
136135
}
137136

138-
s.rootViewController = tvc
137+
s.rootViewController = viewController
139138
s.view.isUserInteractionEnabled = true
140139
completion?(isFinished)
141140
}
@@ -161,6 +160,7 @@ open class TransitionController: UIViewController {
161160
view.contentScaleFactor = Screen.scale
162161

163162
prepareContainer()
163+
prepare(viewController: rootViewController, in: container)
164164
}
165165
}
166166

0 commit comments

Comments
 (0)