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

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

Issue 2698183002: [tab_container] Consolidate tabStrip into tab_container. (Closed)
Patch Set: Created 3 years, 10 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // ====== New Architecture ===== 5 // ====== New Architecture =====
6 // = This code is only used in the new iOS Chrome architecture. = 6 // = This code is only used in the new iOS Chrome architecture. =
7 // ============================================================================ 7 // ============================================================================
8 8
9 #import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h" 9 #import "ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h"
10 10
11 #import "base/mac/foundation_util.h"
12 #import "ios/clean/chrome/browser/ui/ui_types.h" 11 #import "ios/clean/chrome/browser/ui/ui_types.h"
13 12
14 #if !defined(__has_feature) || !__has_feature(objc_arc) 13 #if !defined(__has_feature) || !__has_feature(objc_arc)
15 #error "This file requires ARC support." 14 #error "This file requires ARC support."
16 #endif 15 #endif
17 16
18 namespace { 17 namespace {
19 CGFloat kToolbarHeight = 44.0; 18 CGFloat kToolbarHeight = 44.0f;
19 CGFloat kTabStripHeight = 200.0f;
20 } 20 }
21 21
22 @interface TabContainerViewController () 22 @interface TabContainerViewController ()
23 23
24 // Whichever view controller is at the top of the screen. This view controller 24 // Container views for child view controllers. The child view controller's
25 // controls the status bar. 25 // view is added as a subview that fills it's container view via autoresizing.
26 @property(nonatomic, weak) UIViewController* topmostViewController; 26 @property(nonatomic, strong) UIView* tabStripView;
27 @property(nonatomic, strong) UIView* toolbarView;
28 @property(nonatomic, strong) UIView* contentView;
27 29
28 @property(nonatomic, strong) Constraints* contentConstraintsWithToolbar; 30 // Constraints for the container views. This may be overrided in
marq (ping after 24h) 2017/02/16 12:55:56 overrided -> overridden. Yay, English!
29 @property(nonatomic, strong) Constraints* contentConstraintsWithoutToolbar; 31 // -updateViewConstraints in a subclass.
30 @property(nonatomic, strong) Constraints* toolbarConstraints; 32 @property(nonatomic, strong) Constraints* constraints;
33
34 // Height constraints for tabStripView and toolbarView.
35 @property(nonatomic, strong) NSLayoutConstraint* tabStripHeightConstraint;
36 @property(nonatomic, strong) NSLayoutConstraint* toolbarHeightConstraint;
31 37
32 // Cache for forwarding methods to child view controllers. 38 // Cache for forwarding methods to child view controllers.
33 @property(nonatomic, assign) SEL actionToForward; 39 @property(nonatomic, assign) SEL actionToForward;
34 @property(nonatomic, weak) UIResponder* forwardingTarget; 40 @property(nonatomic, weak) UIResponder* forwardingTarget;
35 41
36 // Contained view controller utility methods.
37 - (void)removeChildViewController:(UIViewController*)viewController;
38
39 // Called after a new content view controller is set, but before
40 // |-didMoveToParentViewController:| is called on that view controller.
41 - (void)didAddContentViewController;
42
43 // Called after a new toolbar view controller is set, but before
44 // |-didMoveToParentViewController:| is called on that view controller.
45 - (void)didAddToolbarViewController;
46
47 // Methods to populate the constraint properties.
48 - (void)updateContentConstraintsWithToolbar;
49 - (void)updateContentConstraintsWithoutToolbar;
50 - (void)updateToolbarConstraints;
51
52 @end 42 @end
53 43
54 @implementation TabContainerViewController 44 @implementation TabContainerViewController
55 45
56 @synthesize contentViewController = _contentViewController; 46 @synthesize contentViewController = _contentViewController;
57 @synthesize toolbarViewController = _toolbarViewController; 47 @synthesize toolbarViewController = _toolbarViewController;
58 @synthesize topmostViewController = _topmostViewController; 48 @synthesize tabStripViewController = _tabStripViewController;
59 @synthesize contentConstraintsWithToolbar = _contentConstraintsWithToolbar; 49 @synthesize tabStripView = _tabStripView;
60 @synthesize contentConstraintsWithoutToolbar = 50 @synthesize toolbarView = _toolbarView;
61 _contentConstraintsWithoutToolbar; 51 @synthesize contentView = _contentView;
62 @synthesize toolbarConstraints = _toolbarConstraints; 52 @synthesize constraints = _constraints;
53 @synthesize tabStripHeightConstraint = _tabStripHeightConstraint;
54 @synthesize toolbarHeightConstraint = _toolbarHeightConstraint;
63 @synthesize actionToForward = _actionToForward; 55 @synthesize actionToForward = _actionToForward;
64 @synthesize forwardingTarget = _forwardingTarget; 56 @synthesize forwardingTarget = _forwardingTarget;
65 57
58 #pragma mark - UIViewController
59
60 - (void)viewDidLoad {
61 [super viewDidLoad];
62 self.tabStripView = [[UIView alloc] init];
63 self.toolbarView = [[UIView alloc] init];
64 self.contentView = [[UIView alloc] init];
65 [self.view addSubview:self.tabStripView];
66 [self.view addSubview:self.toolbarView];
67 [self.view addSubview:self.contentView];
68 self.tabStripView.translatesAutoresizingMaskIntoConstraints = NO;
69 self.toolbarView.translatesAutoresizingMaskIntoConstraints = NO;
70 self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
71 self.view.backgroundColor = [UIColor blackColor];
72 self.tabStripView.backgroundColor = [UIColor blackColor];
73 self.toolbarView.backgroundColor = [UIColor blackColor];
74 self.contentView.backgroundColor = [UIColor blackColor];
75
76 [self addChildViewController:self.tabStripViewController
77 toSubview:self.tabStripView];
78 [self addChildViewController:self.toolbarViewController
79 toSubview:self.toolbarView];
80 [self addChildViewController:self.contentViewController
81 toSubview:self.contentView];
82
83 self.tabStripHeightConstraint =
84 [self.tabStripView.heightAnchor constraintEqualToConstant:0.0f];
85 self.toolbarHeightConstraint =
86 [self.toolbarView.heightAnchor constraintEqualToConstant:0.0f];
87 if (self.toolbarViewController) {
88 self.toolbarHeightConstraint.constant = kToolbarHeight;
89 }
90 }
91
92 - (void)updateViewConstraints {
93 if (!self.constraints) {
94 self.constraints = @[
95 [self.tabStripView.topAnchor
96 constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor],
97 [self.tabStripView.leadingAnchor
98 constraintEqualToAnchor:self.view.leadingAnchor],
99 [self.tabStripView.trailingAnchor
100 constraintEqualToAnchor:self.view.trailingAnchor],
101 self.tabStripHeightConstraint,
102 [self.toolbarView.topAnchor
103 constraintEqualToAnchor:self.tabStripView.bottomAnchor],
104 [self.toolbarView.leadingAnchor
105 constraintEqualToAnchor:self.view.leadingAnchor],
106 [self.toolbarView.trailingAnchor
107 constraintEqualToAnchor:self.view.trailingAnchor],
108 self.toolbarHeightConstraint,
109 [self.contentView.topAnchor
110 constraintEqualToAnchor:self.toolbarView.bottomAnchor],
111 [self.contentView.leadingAnchor
112 constraintEqualToAnchor:self.view.leadingAnchor],
113 [self.contentView.trailingAnchor
114 constraintEqualToAnchor:self.view.trailingAnchor],
115 [self.contentView.bottomAnchor
116 constraintEqualToAnchor:self.bottomLayoutGuide.topAnchor],
117 ];
118 [NSLayoutConstraint activateConstraints:self.constraints];
119 }
120 [super updateViewConstraints];
121 }
122
66 #pragma mark - Public properties 123 #pragma mark - Public properties
67 124
68 - (void)setContentViewController:(UIViewController*)contentViewController { 125 - (void)setContentViewController:(UIViewController*)contentViewController {
69 if (self.contentViewController == contentViewController) 126 if (self.contentViewController == contentViewController)
70 return; 127 return;
71 128 if ([self isViewLoaded]) {
72 // Remove the current content view controller, if any. 129 [self removeChildViewController:self.contentViewController];
73 [NSLayoutConstraint 130 [self addChildViewController:contentViewController
74 deactivateConstraints:self.contentConstraintsWithoutToolbar]; 131 toSubview:self.contentView];
75 [NSLayoutConstraint deactivateConstraints:self.contentConstraintsWithToolbar]; 132 }
76 [self removeChildViewController:self.contentViewController];
77
78 // Add the new content view controller.
79 [self addChildViewController:contentViewController];
80 contentViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
81 [self.view addSubview:contentViewController.view];
82 _contentViewController = contentViewController; 133 _contentViewController = contentViewController;
83 [self didAddContentViewController];
84 [self.view setNeedsUpdateConstraints];
85 [self.contentViewController didMoveToParentViewController:self];
86 } 134 }
87 135
88 - (void)setToolbarViewController:(UIViewController*)toolbarViewController { 136 - (void)setToolbarViewController:(UIViewController*)toolbarViewController {
89 if (self.toolbarViewController == toolbarViewController) 137 if (self.toolbarViewController == toolbarViewController)
90 return; 138 return;
91 139 if ([self isViewLoaded]) {
92 // Remove the current toolbar view controller, if any. 140 [self removeChildViewController:self.toolbarViewController];
93 [NSLayoutConstraint deactivateConstraints:self.toolbarConstraints]; 141 [self addChildViewController:toolbarViewController
94 [NSLayoutConstraint deactivateConstraints:self.contentConstraintsWithToolbar]; 142 toSubview:self.toolbarView];
95 [self removeChildViewController:self.toolbarViewController]; 143 }
96
97 // Add the new toolbar view controller.
98 [self addChildViewController:toolbarViewController];
99 toolbarViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
100 [self.view addSubview:toolbarViewController.view];
101 _toolbarViewController = toolbarViewController; 144 _toolbarViewController = toolbarViewController;
102 [self didAddToolbarViewController];
103 [self.view setNeedsUpdateConstraints];
104 [self.toolbarViewController didMoveToParentViewController:self];
105 } 145 }
106 146
107 #pragma mark - UIViewController 147 - (void)setTabStripViewController:(UIViewController*)tabStripViewController {
108 148 if (self.tabStripViewController == tabStripViewController)
109 - (void)updateViewConstraints { 149 return;
110 if (self.toolbarViewController) { 150 if ([self isViewLoaded]) {
111 [NSLayoutConstraint activateConstraints:self.toolbarConstraints]; 151 [self removeChildViewController:self.tabStripViewController];
112 [NSLayoutConstraint activateConstraints:self.contentConstraintsWithToolbar]; 152 [self addChildViewController:tabStripViewController
113 } else { 153 toSubview:self.tabStripView];
114 [NSLayoutConstraint
115 activateConstraints:self.contentConstraintsWithoutToolbar];
116 } 154 }
117 [super updateViewConstraints]; 155 _tabStripViewController = tabStripViewController;
118 } 156 }
119 157
120 - (UIViewController*)childViewControllerForStatusBarHidden { 158 #pragma mark - ChildViewController helper methods
121 return self.topmostViewController; 159
160 - (void)addChildViewController:(UIViewController*)viewController
161 toSubview:(UIView*)subview {
162 if (!viewController || !subview) {
163 return;
164 }
165 [self addChildViewController:viewController];
166 viewController.view.translatesAutoresizingMaskIntoConstraints = YES;
167 viewController.view.autoresizingMask =
168 UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
169 viewController.view.frame = subview.bounds;
170 [subview addSubview:viewController.view];
171 [viewController didMoveToParentViewController:self];
122 } 172 }
123 173
124 - (UIViewController*)childViewControllerForStatusBarStyle { 174 - (void)removeChildViewController:(UIViewController*)viewController {
125 return self.topmostViewController; 175 if (viewController.parentViewController != self)
176 return;
177 [viewController willMoveToParentViewController:nil];
178 [viewController.view removeFromSuperview];
179 [viewController removeFromParentViewController];
126 } 180 }
127 181
128 #pragma mark - MenuPresentationDelegate 182 #pragma mark - MenuPresentationDelegate
129 183
130 - (CGRect)frameForMenuPresentation:(UIPresentationController*)presentation { 184 - (CGRect)frameForMenuPresentation:(UIPresentationController*)presentation {
131 CGSize menuSize = presentation.presentedView.frame.size; 185 CGSize menuSize = presentation.presentedView.frame.size;
132 CGRect menuRect; 186 CGRect menuRect;
133 menuRect.size = menuSize; 187 menuRect.size = menuSize;
134 188
135 CGRect menuOriginRect = [self rectForZoomWithKey:@"" inView:self.view]; 189 CGRect menuOriginRect = [self rectForZoomWithKey:@"" inView:self.view];
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 246
193 #pragma mark - NSObject method forwarding 247 #pragma mark - NSObject method forwarding
194 248
195 - (id)forwardingTargetForSelector:(SEL)aSelector { 249 - (id)forwardingTargetForSelector:(SEL)aSelector {
196 if (aSelector == self.actionToForward) { 250 if (aSelector == self.actionToForward) {
197 return self.forwardingTarget; 251 return self.forwardingTarget;
198 } 252 }
199 return nil; 253 return nil;
200 } 254 }
201 255
202 #pragma mark - Private methods 256 #pragma mark - TabStripActions
203 257
204 - (void)removeChildViewController:(UIViewController*)viewController { 258 - (void)toggleTabStrip:(id)sender {
205 if (viewController.parentViewController != self) 259 self.tabStripHeightConstraint.constant =
206 return; 260 self.tabStripHeightConstraint.constant > 0.0f ? 0.0f : kTabStripHeight;
207 [viewController willMoveToParentViewController:nil];
208 [viewController.view removeFromSuperview];
209 [viewController removeFromParentViewController];
210 }
211
212 - (void)didAddContentViewController {
213 if (self.toolbarViewController) {
214 [self updateContentConstraintsWithToolbar];
215 } else {
216 self.topmostViewController = self.contentViewController;
217 [self updateContentConstraintsWithoutToolbar];
218 }
219 }
220
221 - (void)didAddToolbarViewController {
222 [self updateToolbarConstraints];
223 // If there's already a content view controller, update the constraints for
224 // that, too.
225 if (self.contentViewController) {
226 [self updateContentConstraintsWithToolbar];
227 }
228 }
229
230 - (void)updateContentConstraintsWithToolbar {
231 // Template method for subclasses to implement;
232 }
233
234 - (void)updateToolbarConstraints {
235 // Template method for subclasses to implement;
236 }
237
238 - (void)updateContentConstraintsWithoutToolbar {
239 UIView* contentView = self.contentViewController.view;
240 self.contentConstraintsWithoutToolbar = @[
241 [contentView.topAnchor constraintEqualToAnchor:self.view.topAnchor],
242 [contentView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
243 [contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
244 [contentView.trailingAnchor
245 constraintEqualToAnchor:self.view.trailingAnchor],
246 ];
247 }
248
249 @end
250
251 @implementation TopToolbarTabViewController
marq (ping after 24h) 2017/02/16 12:55:56 I would like to keep TopToolbar and BottomToolbar
edchin 2017/02/16 16:12:05 I've implemented this in the updated patch.
252
253 - (void)didAddContentViewController {
254 [super didAddContentViewController];
255 if (!self.toolbarViewController) {
256 self.topmostViewController = self.contentViewController;
257 }
258 }
259
260 - (void)didAddToolbarViewController {
261 [super didAddToolbarViewController];
262 self.topmostViewController = self.toolbarViewController;
263 }
264
265 - (void)updateContentConstraintsWithToolbar {
266 UIView* contentView = self.contentViewController.view;
267 self.contentConstraintsWithToolbar = @[
268 [contentView.topAnchor
269 constraintEqualToAnchor:self.toolbarViewController.view.bottomAnchor],
270 [contentView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
271 [contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
272 [contentView.trailingAnchor
273 constraintEqualToAnchor:self.view.trailingAnchor],
274 ];
275 }
276
277 - (void)updateToolbarConstraints {
278 // HACK: This background is added so the status bar portion of the view is not
279 // transparent. This needs to be implemented properly for the top toolbar
280 // case.
281 self.view.backgroundColor = [UIColor lightGrayColor];
282 UIView* toolbarView = self.toolbarViewController.view;
283 self.toolbarConstraints = @[
284 [toolbarView.topAnchor constraintEqualToAnchor:self.view.topAnchor
285 constant:20.0],
286 [toolbarView.heightAnchor constraintEqualToConstant:kToolbarHeight],
287 [toolbarView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
288 [toolbarView.trailingAnchor
289 constraintEqualToAnchor:self.view.trailingAnchor],
290 ];
291 } 261 }
292 262
293 @end 263 @end
294 264
295 @implementation BottomToolbarTabViewController 265 @implementation BottomToolbarTabViewController
296 266
297 - (void)didAddContentViewController { 267 // Override with different constraints.
298 [super didAddContentViewController]; 268 - (void)updateViewConstraints {
299 self.topmostViewController = self.contentViewController; 269 if (!self.constraints) {
marq (ping after 24h) 2017/02/16 12:55:56 Instead of overriding -updateViewConstraints, I'd
edchin 2017/02/16 16:12:05 The benefit of DRY is lost to lack of full compreh
marq (ping after 24h) 2017/02/17 12:16:58 Right now you have this (pseudocode): Base Class:
edchin 2017/02/17 19:48:09 Updated: 1) No more factoring out common constrai
300 } 270 self.constraints = @[
301 271 [self.tabStripView.topAnchor
302 // Note that this class doesn't override -didAddToolbarViewController; in the 272 constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor],
303 // case where there is a toolbar view controller set but not a content view 273 [self.tabStripView.leadingAnchor
304 // controller, functionally there is no topmost view controller, so no 274 constraintEqualToAnchor:self.view.leadingAnchor],
305 // additional action needs to be taken. 275 [self.tabStripView.trailingAnchor
306 276 constraintEqualToAnchor:self.view.trailingAnchor],
307 - (void)updateContentConstraintsWithToolbar { 277 self.tabStripHeightConstraint,
308 UIView* contentView = self.contentViewController.view; 278 [self.contentView.topAnchor
309 self.contentConstraintsWithToolbar = @[ 279 constraintEqualToAnchor:self.tabStripView.bottomAnchor],
310 [contentView.topAnchor constraintEqualToAnchor:self.view.topAnchor], 280 [self.contentView.leadingAnchor
311 [contentView.bottomAnchor 281 constraintEqualToAnchor:self.view.leadingAnchor],
312 constraintEqualToAnchor:self.toolbarViewController.view.topAnchor], 282 [self.contentView.trailingAnchor
313 [contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], 283 constraintEqualToAnchor:self.view.trailingAnchor],
314 [contentView.trailingAnchor 284 [self.toolbarView.topAnchor
315 constraintEqualToAnchor:self.view.trailingAnchor], 285 constraintEqualToAnchor:self.contentView.bottomAnchor],
316 ]; 286 [self.toolbarView.leadingAnchor
317 } 287 constraintEqualToAnchor:self.view.leadingAnchor],
318 288 [self.toolbarView.trailingAnchor
319 - (void)updateToolbarConstraints { 289 constraintEqualToAnchor:self.view.trailingAnchor],
320 UIView* toolbarView = self.toolbarViewController.view; 290 self.toolbarHeightConstraint,
321 self.toolbarConstraints = @[ 291 [self.toolbarView.bottomAnchor
322 [toolbarView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor], 292 constraintEqualToAnchor:self.bottomLayoutGuide.topAnchor],
323 [toolbarView.heightAnchor constraintEqualToConstant:kToolbarHeight], 293 ];
324 [toolbarView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], 294 [NSLayoutConstraint activateConstraints:self.constraints];
325 [toolbarView.trailingAnchor 295 }
326 constraintEqualToAnchor:self.view.trailingAnchor], 296 [super updateViewConstraints];
327 ];
328 } 297 }
329 298
330 @end 299 @end
OLDNEW
« no previous file with comments | « ios/clean/chrome/browser/ui/tab/tab_container_view_controller.h ('k') | ios/clean/chrome/browser/ui/tab/tab_coordinator.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698