Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: ios/chrome/browser/ui/tab/tab_container_view_controller.mm

Issue 2592983003: [Clean Skeleton] Migrate code to clean/ (Closed)
Patch Set: Rebased Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // ====== New Architecture =====
6 // = This code is only used in the new iOS Chrome architecture. =
7 // ============================================================================
8
9 #import "ios/chrome/browser/ui/tab/tab_container_view_controller.h"
10
11 #import "ios/chrome/browser/ui/ui_types.h"
12
13 #if !defined(__has_feature) || !__has_feature(objc_arc)
14 #error "This file requires ARC support."
15 #endif
16
17 namespace {
18 CGFloat kToolbarHeight = 56.0;
19 }
20
21 @interface TabContainerViewController ()
22
23 // Whichever view controller is at the top of the screen. This view controller
24 // controls the status bar.
25 @property(nonatomic, weak) UIViewController* topmostViewController;
26
27 @property(nonatomic, strong) Constraints* contentConstraintsWithToolbar;
28 @property(nonatomic, strong) Constraints* contentConstraintsWithoutToolbar;
29 @property(nonatomic, strong) Constraints* toolbarConstraints;
30
31 // Cache for forwarding methods to child view controllers.
32 @property(nonatomic, assign) SEL actionToForward;
33 @property(nonatomic, weak) UIResponder* forwardingTarget;
34
35 // Contained view controller utility methods.
36 - (void)removeChildViewController:(UIViewController*)viewController;
37
38 // Called after a new content view controller is set, but before
39 // |-didMoveToParentViewController:| is called on that view controller.
40 - (void)didAddContentViewController;
41
42 // Called after a new toolbar view controller is set, but before
43 // |-didMoveToParentViewController:| is called on that view controller.
44 - (void)didAddToolbarViewController;
45
46 // Methods to populate the constraint properties.
47 - (void)updateContentConstraintsWithToolbar;
48 - (void)updateContentConstraintsWithoutToolbar;
49 - (void)updateToolbarConstraints;
50
51 @end
52
53 @implementation TabContainerViewController
54
55 @synthesize contentViewController = _contentViewController;
56 @synthesize toolbarViewController = _toolbarViewController;
57 @synthesize topmostViewController = _topmostViewController;
58 @synthesize contentConstraintsWithToolbar = _contentConstraintsWithToolbar;
59 @synthesize contentConstraintsWithoutToolbar =
60 _contentConstraintsWithoutToolbar;
61 @synthesize toolbarConstraints = _toolbarConstraints;
62 @synthesize actionToForward = _actionToForward;
63 @synthesize forwardingTarget = _forwardingTarget;
64
65 #pragma mark - Public properties
66
67 - (void)setContentViewController:(UIViewController*)contentViewController {
68 if (self.contentViewController == contentViewController)
69 return;
70
71 // Remove the current content view controller, if any.
72 [NSLayoutConstraint
73 deactivateConstraints:self.contentConstraintsWithoutToolbar];
74 [NSLayoutConstraint deactivateConstraints:self.contentConstraintsWithToolbar];
75 [self removeChildViewController:self.contentViewController];
76
77 // Add the new content view controller.
78 [self addChildViewController:contentViewController];
79 contentViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
80 [self.view addSubview:contentViewController.view];
81 _contentViewController = contentViewController;
82 [self didAddContentViewController];
83 [self.view setNeedsUpdateConstraints];
84 [self.contentViewController didMoveToParentViewController:self];
85 }
86
87 - (void)setToolbarViewController:(UIViewController*)toolbarViewController {
88 if (self.toolbarViewController == toolbarViewController)
89 return;
90
91 // Remove the current toolbar view controller, if any.
92 [NSLayoutConstraint deactivateConstraints:self.toolbarConstraints];
93 [NSLayoutConstraint deactivateConstraints:self.contentConstraintsWithToolbar];
94 [self removeChildViewController:self.toolbarViewController];
95
96 // Add the new toolbar view controller.
97 [self addChildViewController:toolbarViewController];
98 toolbarViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
99 [self.view addSubview:toolbarViewController.view];
100 _toolbarViewController = toolbarViewController;
101 [self didAddToolbarViewController];
102 [self.view setNeedsUpdateConstraints];
103 [self.toolbarViewController didMoveToParentViewController:self];
104 }
105
106 #pragma mark - UIViewController
107
108 - (void)updateViewConstraints {
109 if (self.toolbarViewController) {
110 [NSLayoutConstraint activateConstraints:self.toolbarConstraints];
111 [NSLayoutConstraint activateConstraints:self.contentConstraintsWithToolbar];
112 } else {
113 [NSLayoutConstraint
114 activateConstraints:self.contentConstraintsWithoutToolbar];
115 }
116 [super updateViewConstraints];
117 }
118
119 - (UIViewController*)childViewControllerForStatusBarHidden {
120 return self.topmostViewController;
121 }
122
123 - (UIViewController*)childViewControllerForStatusBarStyle {
124 return self.topmostViewController;
125 }
126
127 #pragma mark - MenuPresentationDelegate
128
129 - (CGRect)frameForMenuPresentation:(UIPresentationController*)presentation {
130 // Placeholder.
131 return CGRectMake(50, 50, 250, 300);
132 }
133
134 #pragma mark - UIResponder
135
136 // Before forwarding actions up the responder chain, give both contained
137 // view controllers a chance to handle them.
138 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
139 self.actionToForward = nullptr;
140 self.forwardingTarget = nil;
141 for (UIResponder* responder in
142 @[ self.contentViewController, self.toolbarViewController ]) {
143 if ([responder canPerformAction:action withSender:sender]) {
144 self.actionToForward = action;
145 self.forwardingTarget = responder;
146 return YES;
147 }
148 }
149 return [super canPerformAction:action withSender:sender];
150 }
151
152 #pragma mark - NSObject method forwarding
153
154 - (id)forwardingTargetForSelector:(SEL)aSelector {
155 if (aSelector == self.actionToForward) {
156 return self.forwardingTarget;
157 }
158 return nil;
159 }
160
161 #pragma mark - Private methods
162
163 - (void)removeChildViewController:(UIViewController*)viewController {
164 if (viewController.parentViewController != self)
165 return;
166 [viewController willMoveToParentViewController:nil];
167 [viewController.view removeFromSuperview];
168 [viewController removeFromParentViewController];
169 }
170
171 - (void)didAddContentViewController {
172 if (self.toolbarViewController) {
173 [self updateContentConstraintsWithToolbar];
174 } else {
175 self.topmostViewController = self.contentViewController;
176 [self updateContentConstraintsWithoutToolbar];
177 }
178 }
179
180 - (void)didAddToolbarViewController {
181 [self updateToolbarConstraints];
182 // If there's already a content view controller, update the constraints for
183 // that, too.
184 if (self.contentViewController) {
185 [self updateContentConstraintsWithToolbar];
186 }
187 }
188
189 - (void)updateContentConstraintsWithToolbar {
190 // Template method for subclasses to implement;
191 }
192
193 - (void)updateToolbarConstraints {
194 // Template method for subclasses to implement;
195 }
196
197 - (void)updateContentConstraintsWithoutToolbar {
198 UIView* contentView = self.contentViewController.view;
199 self.contentConstraintsWithoutToolbar = @[
200 [contentView.topAnchor constraintEqualToAnchor:self.view.topAnchor],
201 [contentView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
202 [contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
203 [contentView.trailingAnchor
204 constraintEqualToAnchor:self.view.trailingAnchor],
205 ];
206 }
207
208 @end
209
210 @implementation TopToolbarTabViewController
211
212 - (void)didAddContentViewController {
213 [super didAddContentViewController];
214 if (!self.toolbarViewController) {
215 self.topmostViewController = self.contentViewController;
216 }
217 }
218
219 - (void)didAddToolbarViewController {
220 [super didAddToolbarViewController];
221 self.topmostViewController = self.toolbarViewController;
222 }
223
224 - (void)updateContentConstraintsWithToolbar {
225 UIView* contentView = self.contentViewController.view;
226 self.contentConstraintsWithToolbar = @[
227 [contentView.topAnchor
228 constraintEqualToAnchor:self.toolbarViewController.view.bottomAnchor],
229 [contentView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
230 [contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
231 [contentView.trailingAnchor
232 constraintEqualToAnchor:self.view.trailingAnchor],
233 ];
234 }
235
236 - (void)updateToolbarConstraints {
237 UIView* toolbarView = self.toolbarViewController.view;
238 self.toolbarConstraints = @[
239 [toolbarView.topAnchor constraintEqualToAnchor:self.view.topAnchor],
240 [toolbarView.heightAnchor constraintEqualToConstant:kToolbarHeight],
241 [toolbarView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
242 [toolbarView.trailingAnchor
243 constraintEqualToAnchor:self.view.trailingAnchor],
244 ];
245 }
246
247 @end
248
249 @implementation BottomToolbarTabViewController
250
251 - (void)didAddContentViewController {
252 [super didAddContentViewController];
253 self.topmostViewController = self.contentViewController;
254 }
255
256 // Note that this class doesn't override -didAddToolbarViewController; in the
257 // case where there is a toolbar view controller set but not a content view
258 // controller, functionally there is no topmost view controller, so no
259 // additional action needs to be taken.
260
261 - (void)updateContentConstraintsWithToolbar {
262 UIView* contentView = self.contentViewController.view;
263 self.contentConstraintsWithToolbar = @[
264 [contentView.topAnchor constraintEqualToAnchor:self.view.topAnchor],
265 [contentView.bottomAnchor
266 constraintEqualToAnchor:self.toolbarViewController.view.topAnchor],
267 [contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
268 [contentView.trailingAnchor
269 constraintEqualToAnchor:self.view.trailingAnchor],
270 ];
271 }
272
273 - (void)updateToolbarConstraints {
274 UIView* toolbarView = self.toolbarViewController.view;
275 self.toolbarConstraints = @[
276 [toolbarView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
277 [toolbarView.heightAnchor constraintEqualToConstant:kToolbarHeight],
278 [toolbarView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
279 [toolbarView.trailingAnchor
280 constraintEqualToAnchor:self.view.trailingAnchor],
281 ];
282 }
283
284 @end
OLDNEW
« no previous file with comments | « ios/chrome/browser/ui/tab/tab_container_view_controller.h ('k') | ios/chrome/browser/ui/tab/tab_coordinator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698