Chromium Code Reviews| OLD | NEW |
|---|---|
| (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/strip/strip_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 kStripHeight = 200.0; | |
| 19 } | |
| 20 | |
| 21 @interface StripContainerViewController () | |
| 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; | |
|
marq (ping after 24h)
2016/12/21 17:26:15
I don't think you need this if we aren't going to
edchin
2016/12/22 10:17:17
This container implementation accounts for when th
marq (ping after 24h)
2016/12/22 11:33:07
You are of course correct.
| |
| 26 | |
| 27 @property(nonatomic, strong) Constraints* contentConstraintsWithStrip; | |
| 28 @property(nonatomic, strong) Constraints* contentConstraintsWithoutStrip; | |
| 29 @property(nonatomic, strong) Constraints* stripConstraints; | |
| 30 | |
| 31 // Cache for forwarding methods to child view controllers. | |
| 32 @property(nonatomic, assign) SEL actionToForward; | |
| 33 @property(nonatomic, weak) UIResponder* forwardingTarget; | |
| 34 | |
| 35 @property(nonatomic, strong) NSLayoutConstraint* stripHeightConstraint; | |
| 36 | |
| 37 // Contained view controller utility methods. | |
| 38 - (void)removeChildViewController:(UIViewController*)viewController; | |
| 39 | |
| 40 // Called after a new content view controller is set, but before | |
| 41 // |-didMoveToParentViewController:| is called on that view controller. | |
| 42 - (void)didAddContentViewController; | |
| 43 | |
| 44 // Called after a new strip view controller is set, but before | |
| 45 // |-didMoveToParentViewController:| is called on that view controller. | |
| 46 - (void)didAddContentViewController; | |
|
marq (ping after 24h)
2016/12/21 17:26:15
-didAddStripViewController, right? Or is this erro
edchin
2016/12/22 10:17:17
Error in tab container as well. Will update that i
| |
| 47 | |
| 48 // Methods to populate the constraint properties. | |
| 49 - (void)updateContentConstraintsWithStrip; | |
| 50 - (void)updateContentConstraintsWithoutStrip; | |
| 51 - (void)updateStripConstraints; | |
| 52 | |
| 53 @end | |
| 54 | |
| 55 @implementation StripContainerViewController | |
| 56 | |
| 57 @synthesize contentViewController = _contentViewController; | |
| 58 @synthesize stripViewController = _stripViewController; | |
| 59 @synthesize topmostViewController = _topmostViewController; | |
| 60 @synthesize contentConstraintsWithStrip = _contentConstraintsWithStrip; | |
| 61 @synthesize contentConstraintsWithoutStrip = _contentConstraintsWithoutStrip; | |
| 62 @synthesize stripConstraints = _stripConstraints; | |
| 63 @synthesize actionToForward = _actionToForward; | |
| 64 @synthesize forwardingTarget = _forwardingTarget; | |
| 65 @synthesize stripHeightConstraint = _stripHeightConstraint; | |
| 66 | |
| 67 #pragma mark - Public properties | |
| 68 | |
| 69 - (void)setContentViewController:(UIViewController*)contentViewController { | |
| 70 if (self.contentViewController == contentViewController) | |
| 71 return; | |
| 72 | |
| 73 // Remove the current content view controller, if any. | |
| 74 [NSLayoutConstraint | |
| 75 deactivateConstraints:self.contentConstraintsWithoutStrip]; | |
| 76 [NSLayoutConstraint deactivateConstraints:self.contentConstraintsWithStrip]; | |
| 77 [self removeChildViewController:self.contentViewController]; | |
| 78 | |
| 79 // Add the new content view controller. | |
| 80 [self addChildViewController:contentViewController]; | |
| 81 contentViewController.view.translatesAutoresizingMaskIntoConstraints = NO; | |
| 82 [self.view addSubview:contentViewController.view]; | |
| 83 _contentViewController = contentViewController; | |
| 84 [self didAddContentViewController]; | |
| 85 [self.view setNeedsUpdateConstraints]; | |
| 86 [self.contentViewController didMoveToParentViewController:self]; | |
| 87 } | |
| 88 | |
| 89 - (void)setStripViewController:(UIViewController*)stripViewController { | |
| 90 if (self.stripViewController == stripViewController) | |
| 91 return; | |
| 92 | |
| 93 // Remove the current strip view controller, if any. | |
| 94 [NSLayoutConstraint deactivateConstraints:self.stripConstraints]; | |
| 95 [NSLayoutConstraint deactivateConstraints:self.contentConstraintsWithStrip]; | |
| 96 [self removeChildViewController:self.stripViewController]; | |
| 97 | |
| 98 // Add the new strip view controller. | |
| 99 [self addChildViewController:stripViewController]; | |
| 100 stripViewController.view.translatesAutoresizingMaskIntoConstraints = NO; | |
| 101 [self.view addSubview:stripViewController.view]; | |
| 102 _stripViewController = stripViewController; | |
| 103 [self didAddStripViewController]; | |
| 104 [self.view setNeedsUpdateConstraints]; | |
| 105 [self.stripViewController didMoveToParentViewController:self]; | |
| 106 } | |
| 107 | |
| 108 #pragma mark - UIViewController | |
| 109 | |
| 110 - (void)updateViewConstraints { | |
| 111 if (self.stripViewController) { | |
| 112 [NSLayoutConstraint activateConstraints:self.stripConstraints]; | |
| 113 [NSLayoutConstraint activateConstraints:self.contentConstraintsWithStrip]; | |
| 114 } else { | |
| 115 [NSLayoutConstraint | |
| 116 activateConstraints:self.contentConstraintsWithoutStrip]; | |
| 117 } | |
| 118 [super updateViewConstraints]; | |
| 119 } | |
| 120 | |
| 121 - (UIViewController*)childViewControllerForStatusBarHidden { | |
| 122 return self.topmostViewController; | |
| 123 } | |
| 124 | |
| 125 - (UIViewController*)childViewControllerForStatusBarStyle { | |
| 126 return self.topmostViewController; | |
| 127 } | |
| 128 | |
| 129 #pragma mark - UIResponder | |
| 130 | |
| 131 // Before forwarding actions up the responder chain, give both contained | |
| 132 // view controllers a chance to handle them. | |
| 133 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { | |
| 134 self.actionToForward = nullptr; | |
| 135 self.forwardingTarget = nil; | |
| 136 for (UIResponder* responder in | |
| 137 @[ self.contentViewController, self.stripViewController ]) { | |
| 138 if ([responder canPerformAction:action withSender:sender]) { | |
| 139 self.actionToForward = action; | |
| 140 self.forwardingTarget = responder; | |
| 141 return YES; | |
| 142 } | |
| 143 } | |
| 144 return [super canPerformAction:action withSender:sender]; | |
| 145 } | |
| 146 | |
| 147 #pragma mark - NSObject method forwarding | |
| 148 | |
| 149 - (id)forwardingTargetForSelector:(SEL)aSelector { | |
| 150 if (aSelector == self.actionToForward) { | |
| 151 return self.forwardingTarget; | |
| 152 } | |
| 153 return nil; | |
| 154 } | |
| 155 | |
| 156 #pragma mark - Private methods | |
| 157 | |
| 158 - (void)removeChildViewController:(UIViewController*)viewController { | |
| 159 if (viewController.parentViewController != self) | |
| 160 return; | |
| 161 [viewController willMoveToParentViewController:nil]; | |
| 162 [viewController.view removeFromSuperview]; | |
| 163 [viewController removeFromParentViewController]; | |
| 164 } | |
| 165 | |
| 166 - (void)didAddContentViewController { | |
| 167 if (self.stripViewController) { | |
| 168 [self updateContentConstraintsWithStrip]; | |
| 169 } else { | |
| 170 self.topmostViewController = self.contentViewController; | |
| 171 [self updateContentConstraintsWithoutStrip]; | |
| 172 } | |
| 173 if (!self.stripViewController) { | |
| 174 self.topmostViewController = self.contentViewController; | |
| 175 } | |
| 176 } | |
| 177 | |
| 178 - (void)didAddStripViewController { | |
| 179 [self updateStripConstraints]; | |
| 180 // If there's already a content view controller, update the constraints for | |
| 181 // that, too. | |
| 182 if (self.contentViewController) { | |
| 183 [self updateContentConstraintsWithStrip]; | |
| 184 } | |
| 185 self.topmostViewController = self.stripViewController; | |
| 186 } | |
| 187 | |
| 188 - (void)updateContentConstraintsWithoutStrip { | |
| 189 UIView* contentView = self.contentViewController.view; | |
| 190 self.contentConstraintsWithoutStrip = @[ | |
| 191 [contentView.topAnchor constraintEqualToAnchor:self.view.topAnchor], | |
| 192 [contentView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor], | |
| 193 [contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], | |
| 194 [contentView.trailingAnchor | |
| 195 constraintEqualToAnchor:self.view.trailingAnchor], | |
| 196 ]; | |
| 197 } | |
| 198 | |
| 199 - (void)updateContentConstraintsWithStrip { | |
| 200 UIView* contentView = self.contentViewController.view; | |
| 201 self.contentConstraintsWithStrip = @[ | |
| 202 [contentView.topAnchor | |
| 203 constraintEqualToAnchor:self.stripViewController.view.bottomAnchor], | |
| 204 [contentView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor], | |
| 205 [contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], | |
| 206 [contentView.trailingAnchor | |
| 207 constraintEqualToAnchor:self.view.trailingAnchor], | |
| 208 ]; | |
| 209 } | |
| 210 | |
| 211 - (void)updateStripConstraints { | |
| 212 UIView* stripView = self.stripViewController.view; | |
| 213 self.stripHeightConstraint = | |
| 214 [stripView.heightAnchor constraintEqualToConstant:0.0]; | |
| 215 self.stripConstraints = @[ | |
| 216 [stripView.topAnchor constraintEqualToAnchor:self.view.topAnchor], | |
| 217 [stripView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], | |
| 218 [stripView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor], | |
| 219 self.stripHeightConstraint, | |
| 220 ]; | |
| 221 } | |
| 222 | |
| 223 // Action for UIResponder chain that toggles visibility of tab strip. | |
|
marq (ping after 24h)
2016/12/21 17:26:15
Nit: all actions are by definition using the respo
edchin
2016/12/22 10:17:17
Done.
| |
| 224 - (void)toggleTabStrip:(id)sender { | |
|
marq (ping after 24h)
2016/12/21 17:26:15
Add a ui/actions/tab_strip_actions.h file with a T
edchin
2016/12/22 10:17:17
Done.
| |
| 225 self.stripHeightConstraint.constant = | |
| 226 self.stripHeightConstraint.constant > 0 ? 0.0 : kStripHeight; | |
| 227 [self.view setNeedsUpdateConstraints]; | |
|
marq (ping after 24h)
2016/12/21 17:26:15
Is this needed? No constraints have been added or
edchin
2016/12/22 10:17:17
Done.
| |
| 228 [self.view updateConstraintsIfNeeded]; | |
| 229 } | |
| 230 | |
| 231 @end | |
| OLD | NEW |