UIStackView的内在内容大小(intrinsicContentSize)

20

我正在使用以下配置的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)]

堆栈视图的 intrinsicContentSize.width 应为 30

但实际上,我得到的是:

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

这告诉我无法提供intrinsicContentSize

你们有人知道我是否做错了什么,这种行为是故意的还是一个bug吗?

3个回答

21

从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被允许(由其约束条件)选择自己的大小,则会根据其设置的子视图的固有内容大小(或您在其排列的子视图的大小上设置的其他约束条件)来确定其大小。


1
想象一下,如果我把所有的东西都放在一个 stackview 中,并将此 stackview 添加到其 superView 中。但是,我仍然有另一个视图(实际上是一个 viewController 的视图)在我的 superView 中。如何对这两个视图进行约束,以便 stackview 只占用其内在大小,而将其余部分留给 childVC? - mfaani
1
听起来你需要发布自己的顶级问题。 - rob mayoff
你说得对。我只是想要个大致的概念,就像一个两行的回答。而且我之所以没有发表问题,是因为这是我的备选方案...我的原计划出了问题,但同时也占用了我所有的编码资源,所以我只是想要个大致的估计,需要做什么。你能给我一个两行的回答吗?:/ 如果有更多的问题,我会直接问的。 - mfaani
我需要更多关于你的视图层级结构的细节,这需要另外一个问题来解决。 - rob mayoff
@Honey 我的解决方案是 - 不要使用UIStackView(自己实现,这并不难) - Sam

6

使用以下内容:

stackView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)

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

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

2

您创建的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 变量从哪里来的? - simonseyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接