910e62b5创建于 1月15日历史提交
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/common/ui/button_stack/button_stack_utils.h"

#import "ios/chrome/common/ui/button_stack/button_stack_constants.h"
#import "ios/chrome/common/ui/util/ui_util.h"

namespace {

// Percentage width on iPad for the promo style view controller.
CGFloat PromoStyleContentWidthMultiplier(UITraitCollection* traitCollection) {
  if (traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact) {
    return .9;
  }
  return .8;
}

// Optimal width for the button stack content.
constexpr CGFloat kButtonStackContentOptimalWidth = 327;

}  // namespace

UILayoutGuide* AddButtonStackContentWidthLayoutGuide(UIView* view) {
  // Create a layout guide to constrain the width of the content, while still
  // allowing the scroll view to take the full screen width.
  UILayoutGuide* widthLayoutGuide = [[UILayoutGuide alloc] init];
  [view addLayoutGuide:widthLayoutGuide];
  // Content width layout guide constraints. Constrain the width to both at
  // least 80% of the view width, and to the full view width with margins.
  // This is to accomodate the iPad layout, which cannot be isolated out using
  // the traitCollection because of the FormSheet presentation style
  // (iPad FormSheet is considered compact).
  [NSLayoutConstraint activateConstraints:@[
    [widthLayoutGuide.centerXAnchor
        constraintEqualToAnchor:view.safeAreaLayoutGuide.centerXAnchor],
    [widthLayoutGuide.widthAnchor
        constraintGreaterThanOrEqualToAnchor:view.safeAreaLayoutGuide
                                                 .widthAnchor
                                  multiplier:PromoStyleContentWidthMultiplier(
                                                 view.traitCollection)],
    [widthLayoutGuide.widthAnchor
        constraintLessThanOrEqualToAnchor:view.safeAreaLayoutGuide.widthAnchor
                                 constant:-2 * kButtonStackMargin],
  ]];
  // This constraint is added to enforce that the content width should be as
  // close to the optimal width as possible, within the range already activated
  // for "widthLayoutGuide.widthAnchor" previously, with a higher priority.
  // In this case, the content width in iPad and iPhone landscape mode should be
  // the safe layout width multiplied by PromoStyleContentWidthMultiplier(),
  // while the content width for a iPhone portrait mode should be
  // kButtonStackContentOptimalWidth.
  NSLayoutConstraint* contentLayoutGuideWidthConstraint =
      [widthLayoutGuide.widthAnchor
          constraintEqualToConstant:kButtonStackContentOptimalWidth];
  contentLayoutGuideWidthConstraint.priority = UILayoutPriorityRequired - 1;
  contentLayoutGuideWidthConstraint.active = YES;

  return widthLayoutGuide;
}