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

Unified Diff: ios/chrome/browser/ui/tab/tab_container_view_controller.mm

Issue 2587023002: Upstream Chrome on iOS source code [8/11]. (Closed)
Patch Set: Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: ios/chrome/browser/ui/tab/tab_container_view_controller.mm
diff --git a/ios/chrome/browser/ui/tab/tab_container_view_controller.mm b/ios/chrome/browser/ui/tab/tab_container_view_controller.mm
new file mode 100644
index 0000000000000000000000000000000000000000..7a54d1908ec4cb584a8d00ca7ba12376024480d9
--- /dev/null
+++ b/ios/chrome/browser/ui/tab/tab_container_view_controller.mm
@@ -0,0 +1,284 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// ====== New Architecture =====
+// = This code is only used in the new iOS Chrome architecture. =
+// ============================================================================
+
+#import "ios/chrome/browser/ui/tab/tab_container_view_controller.h"
+
+#import "ios/chrome/browser/ui/ui_types.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+CGFloat kToolbarHeight = 56.0;
+}
+
+@interface TabContainerViewController ()
+
+// Whichever view controller is at the top of the screen. This view controller
+// controls the status bar.
+@property(nonatomic, weak) UIViewController* topmostViewController;
+
+@property(nonatomic, strong) Constraints* contentConstraintsWithToolbar;
+@property(nonatomic, strong) Constraints* contentConstraintsWithoutToolbar;
+@property(nonatomic, strong) Constraints* toolbarConstraints;
+
+// Cache for forwarding methods to child view controllers.
+@property(nonatomic, assign) SEL actionToForward;
+@property(nonatomic, weak) UIResponder* forwardingTarget;
+
+// Contained view controller utility methods.
+- (void)removeChildViewController:(UIViewController*)viewController;
+
+// Called after a new content view controller is set, but before
+// |-didMoveToParentViewController:| is called on that view controller.
+- (void)didAddContentViewController;
+
+// Called after a new toolbar view controller is set, but before
+// |-didMoveToParentViewController:| is called on that view controller.
+- (void)didAddContentViewController;
+
+// Methods to populate the constraint properties.
+- (void)updateContentConstraintsWithToolbar;
+- (void)updateContentConstraintsWithoutToolbar;
+- (void)updateToolbarConstraints;
+
+@end
+
+@implementation TabContainerViewController
+
+@synthesize contentViewController = _contentViewController;
+@synthesize toolbarViewController = _toolbarViewController;
+@synthesize topmostViewController = _topmostViewController;
+@synthesize contentConstraintsWithToolbar = _contentConstraintsWithToolbar;
+@synthesize contentConstraintsWithoutToolbar =
+ _contentConstraintsWithoutToolbar;
+@synthesize toolbarConstraints = _toolbarConstraints;
+@synthesize actionToForward = _actionToForward;
+@synthesize forwardingTarget = _forwardingTarget;
+
+#pragma mark - Public properties
+
+- (void)setContentViewController:(UIViewController*)contentViewController {
+ if (self.contentViewController == contentViewController)
+ return;
+
+ // Remove the current content view controller, if any.
+ [NSLayoutConstraint
+ deactivateConstraints:self.contentConstraintsWithoutToolbar];
+ [NSLayoutConstraint deactivateConstraints:self.contentConstraintsWithToolbar];
+ [self removeChildViewController:self.contentViewController];
+
+ // Add the new content view controller.
+ [self addChildViewController:contentViewController];
+ contentViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
+ [self.view addSubview:contentViewController.view];
+ _contentViewController = contentViewController;
+ [self didAddContentViewController];
+ [self.view setNeedsUpdateConstraints];
+ [self.contentViewController didMoveToParentViewController:self];
+}
+
+- (void)setToolbarViewController:(UIViewController*)toolbarViewController {
+ if (self.toolbarViewController == toolbarViewController)
+ return;
+
+ // Remove the current toolbar view controller, if any.
+ [NSLayoutConstraint deactivateConstraints:self.toolbarConstraints];
+ [NSLayoutConstraint deactivateConstraints:self.contentConstraintsWithToolbar];
+ [self removeChildViewController:self.toolbarViewController];
+
+ // Add the new toolbar view controller.
+ [self addChildViewController:toolbarViewController];
+ toolbarViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
+ [self.view addSubview:toolbarViewController.view];
+ _toolbarViewController = toolbarViewController;
+ [self didAddToolbarViewController];
+ [self.view setNeedsUpdateConstraints];
+ [self.toolbarViewController didMoveToParentViewController:self];
+}
+
+#pragma mark - UIViewController
+
+- (void)updateViewConstraints {
+ if (self.toolbarViewController) {
+ [NSLayoutConstraint activateConstraints:self.toolbarConstraints];
+ [NSLayoutConstraint activateConstraints:self.contentConstraintsWithToolbar];
+ } else {
+ [NSLayoutConstraint
+ activateConstraints:self.contentConstraintsWithoutToolbar];
+ }
+ [super updateViewConstraints];
+}
+
+- (UIViewController*)childViewControllerForStatusBarHidden {
+ return self.topmostViewController;
+}
+
+- (UIViewController*)childViewControllerForStatusBarStyle {
+ return self.topmostViewController;
+}
+
+#pragma mark - MenuPresentationDelegate
+
+- (CGRect)frameForMenuPresentation:(UIPresentationController*)presentation {
+ // Placeholder.
+ return CGRectMake(50, 50, 250, 300);
+}
+
+#pragma mark - UIResponder
+
+// Before forwarding actions up the responder chain, give both contained
+// view controllers a chance to handle them.
+- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
+ self.actionToForward = nullptr;
+ self.forwardingTarget = nil;
+ for (UIResponder* responder in
+ @[ self.contentViewController, self.toolbarViewController ]) {
+ if ([responder canPerformAction:action withSender:sender]) {
+ self.actionToForward = action;
+ self.forwardingTarget = responder;
+ return YES;
+ }
+ }
+ return [super canPerformAction:action withSender:sender];
+}
+
+#pragma mark - NSObject method forwarding
+
+- (id)forwardingTargetForSelector:(SEL)aSelector {
+ if (aSelector == self.actionToForward) {
+ return self.forwardingTarget;
+ }
+ return nil;
+}
+
+#pragma mark - Private methods
+
+- (void)removeChildViewController:(UIViewController*)viewController {
+ if (viewController.parentViewController != self)
+ return;
+ [viewController willMoveToParentViewController:nil];
+ [viewController.view removeFromSuperview];
+ [viewController removeFromParentViewController];
+}
+
+- (void)didAddContentViewController {
+ if (self.toolbarViewController) {
+ [self updateContentConstraintsWithToolbar];
+ } else {
+ self.topmostViewController = self.contentViewController;
+ [self updateContentConstraintsWithoutToolbar];
+ }
+}
+
+- (void)didAddToolbarViewController {
+ [self updateToolbarConstraints];
+ // If there's already a content view controller, update the constraints for
+ // that, too.
+ if (self.contentViewController) {
+ [self updateContentConstraintsWithToolbar];
+ }
+}
+
+- (void)updateContentConstraintsWithToolbar {
+ // Template method for subclasses to implement;
+}
+
+- (void)updateToolbarConstraints {
+ // Template method for subclasses to implement;
+}
+
+- (void)updateContentConstraintsWithoutToolbar {
+ UIView* contentView = self.contentViewController.view;
+ self.contentConstraintsWithoutToolbar = @[
+ [contentView.topAnchor constraintEqualToAnchor:self.view.topAnchor],
+ [contentView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
+ [contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
+ [contentView.trailingAnchor
+ constraintEqualToAnchor:self.view.trailingAnchor],
+ ];
+}
+
+@end
+
+@implementation TopToolbarTabViewController
+
+- (void)didAddContentViewController {
+ [super didAddContentViewController];
+ if (!self.toolbarViewController) {
+ self.topmostViewController = self.contentViewController;
+ }
+}
+
+- (void)didAddToolbarViewController {
+ [super didAddToolbarViewController];
+ self.topmostViewController = self.toolbarViewController;
+}
+
+- (void)updateContentConstraintsWithToolbar {
+ UIView* contentView = self.contentViewController.view;
+ self.contentConstraintsWithToolbar = @[
+ [contentView.topAnchor
+ constraintEqualToAnchor:self.toolbarViewController.view.bottomAnchor],
+ [contentView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
+ [contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
+ [contentView.trailingAnchor
+ constraintEqualToAnchor:self.view.trailingAnchor],
+ ];
+}
+
+- (void)updateToolbarConstraints {
+ UIView* toolbarView = self.toolbarViewController.view;
+ self.toolbarConstraints = @[
+ [toolbarView.topAnchor constraintEqualToAnchor:self.view.topAnchor],
+ [toolbarView.heightAnchor constraintEqualToConstant:kToolbarHeight],
+ [toolbarView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
+ [toolbarView.trailingAnchor
+ constraintEqualToAnchor:self.view.trailingAnchor],
+ ];
+}
+
+@end
+
+@implementation BottomToolbarTabViewController
+
+- (void)didAddContentViewController {
+ [super didAddContentViewController];
+ self.topmostViewController = self.contentViewController;
+}
+
+// Note that this class doesn't override -didAddToolbarViewController; in the
+// case where there is a toolbar view controller set but not a content view
+// controller, functionally there is no topmost view controller, so no
+// additional action needs to be taken.
+
+- (void)updateContentConstraintsWithToolbar {
+ UIView* contentView = self.contentViewController.view;
+ self.contentConstraintsWithToolbar = @[
+ [contentView.topAnchor constraintEqualToAnchor:self.view.topAnchor],
+ [contentView.bottomAnchor
+ constraintEqualToAnchor:self.toolbarViewController.view.topAnchor],
+ [contentView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
+ [contentView.trailingAnchor
+ constraintEqualToAnchor:self.view.trailingAnchor],
+ ];
+}
+
+- (void)updateToolbarConstraints {
+ UIView* toolbarView = self.toolbarViewController.view;
+ self.toolbarConstraints = @[
+ [toolbarView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
+ [toolbarView.heightAnchor constraintEqualToConstant:kToolbarHeight],
+ [toolbarView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
+ [toolbarView.trailingAnchor
+ constraintEqualToAnchor:self.view.trailingAnchor],
+ ];
+}
+
+@end
« 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