【问题标题】:UIStackView's own intrinsicContentSizeUIStackView自己的intrinsicContentSize
【发布时间】:2015-10-26 14:52:21
【问题描述】:

我正在使用具有以下配置的 UIStackView:

let contentView = UIStackView()
contentView.distribution = .EqualSpacing
contentView.alignment = .Center
contentView.spacing = horizontalSpacing

每个元素都有自己的intrinsicContentSize,因此UIStackView 应该可以提供自己的intrinsicContentSize。该文档指出spacing 用作最小间距。

例子:

view1: width=10
view2: width=15
spacing = 5
[view1(10)]-5-[view2(15)]

stackView 的intrinsicContentSize.width 应该是30

相反,我得到:

▿ CGSize
 - width : -1.0
 - height : -1.0 { ... }

这告诉我无法提供intrinsicContentSize

你们有谁知道我是否做错了什么、这种行为是有意的还是这是一个错误?

【问题讨论】:

    标签: ios objective-c swift uikit uistackview


    【解决方案1】:

    从 iOS 9.1 开始,UIStackView 不实现 intrinsicContentSize

    import UIKit
    import ObjectiveC
    
    let stackViewMethod = class_getInstanceMethod(UIStackView.self, "intrinsicContentSize")
    let viewMethod = class_getInstanceMethod(UIView.self, "intrinsicContentSize")
    print(stackViewMethod == viewMethod)
    

    输出:

    true
    

    如果你真的需要,你可以创建一个UIStackView 的子类并自己实现它。不过,您不应该这样做。如果UIStackView 被允许(通过它的约束)选择它自己的大小,它会根据其排列的子视图的内在内容大小(或您对其排列的子视图的大小设置的其他约束)来选择。

    【讨论】:

    • 想象一下,如果我将所有东西都放在一个 stackview 中,然后我将这个 stackview 添加到它的 superView 中。但是我的 superView 中还有另一个视图(实际上我有一个 viewController 的视图)。如何将这两者相互约束,以便 stackview 仅采用其固有大小并将其余部分留给 childVC?
    • 听起来您需要发布自己的顶级问题。
    • 你是对的。我只是想得到一个粗略的想法。就像一个 2 行响应。另外我没有发布问题的原因是因为这是我的 PlanB ......我的 planA 让我失望了,但也占用了我所有的编码带宽,所以我只想粗略估计需要做什么。你能给我一个2行回复吗? :/还有什么我会问一个问题
    • 我需要您的视图层次结构的更多详细信息,这需要一个单独的问题。
    • @Honey 我的解决方案是 - 不要使用 UIStackView(实现你自己的,这并不难)
    【解决方案2】:

    改用这个:

    stackView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
    

    如果您希望将其放入视图中,您可以传递实际视图的框架以及水平和垂直配件所需的优先级。例如,这将保留视图的宽度并调整高度:

    stackView.systemLayoutSizeFitting(view.frame.size, withHorizontalFittingPriority: .required, verticalFittingPriority: .defaultLow)
    

    【讨论】:

      【解决方案3】:

      您创建的 UIView 的固有高度和宽度为零。尝试对底层 UIView 使用自动布局约束。

      您也可以使用自动布局来调整 UIStackView 的大小,如果您这样做,请不要将对齐设置为居中,您应该使用填充来代替。

      示例:

      @property (nonatomic, strong) UIStackView *firstStackView;
      
      @property (nonatomic, strong) UIView *redView;
      @property (nonatomic, strong) UIView *blueView;
      @property (nonatomic, strong) UIView *yellowView;
      @property (nonatomic, strong) UIView *greenView;
      
      @property (nonatomic, strong) NSArray *subViews;
      
      self.redView = [[UIView alloc] init];
      self.redView.backgroundColor = [UIColor redColor];
      self.blueView = [[UIView alloc]  init];
      self.blueView.backgroundColor = [UIColor blueColor];
      self.yellowView = [[UIView alloc] init];
      self.yellowView.backgroundColor = [UIColor yellowColor];
      self.greenView = [[UIView alloc] init];
      self.greenView.backgroundColor = [UIColor blackColor];
      self.subViews = @[self.greenView,self.yellowView,self.redView,self.blueView];
      
      self.firstStackView = [[UIStackView alloc] initWithArrangedSubviews:self.subViews];
      self.firstStackView.translatesAutoresizingMaskIntoConstraints = NO;
      self.firstStackView.distribution = UIStackViewDistributionFillEqually;
      self.firstStackView.axis = UILayoutConstraintAxisHorizontal;
      self.firstStackView.alignment = UIStackViewAlignmentFill;
      
      [self.firstStackView.heightAnchor constraintEqualToConstant:40].active = YES;
      [self.firstStackView.widthAnchor constraintEqualToConstant:500].active = YES;
      

      这将起作用,因为 stackview 现在具有高度和宽度。

      【讨论】:

      • stackViewForCell 变量从何而来?
      猜你喜欢
      • 2018-02-25
      • 2021-08-27
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 2018-09-05
      相关资源
      最近更新 更多