14

我正在使用具有以下配置的 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无法提供。

你们中的任何人都知道我是否做错了什么,这种行为是有意的还是这是一个错误?

4

3 回答 3

18

从 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允许(通过对它的约束)选择自己的大小,它会根据其排列的子视图的内在内容大小(或通过您对其排列的子视图的大小设置的其他约束)来选择。

于 2015-10-29T18:58:56.990 回答
3

得到这个:

stackView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)

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

stackView.systemLayoutSizeFitting(view.frame.size, withHorizontalFittingPriority: .required, verticalFittingPriority: .defaultLow)
于 2020-12-27T10:09:19.953 回答
2

您创建的 UIViews 的固有高度和宽度为零。尝试对底层 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 现在具有高度和宽度。

于 2015-10-29T18:46:54.010 回答