ios - UIStackView 可以被约束吗?

标签 ios cocoa-touch autolayout uistackview

我有一个 UIScrollView 可以填充所有窗口并且包含一个垂直的 UIStackView 我想在其中添加 UILabels 以填充所有可用宽度.

UIStackView 固定在 UIScrollView 的所有边缘,我希望它填充所有 UIScrollView。但它似乎完全忽略了所有的约束,并且它的尺寸只适合它的 child 。为什么会有这种行为?

为了说明如果我以这种方式添加标签:

    scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))
    scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))

    for _ in 1 ... 20 {
        let textLabel = UILabel()
        textLabel.backgroundColor = UIColor.yellow
        textLabel.text  = "Hi World xxxx"
        stackView.addArrangedSubview(textLabel)
        textLabel.widthAnchor.constraint(equalTo: stackView.widthAnchor).isActive = true //Doesn't work as expected

    }

我得到的是:(青​​色背景是 UIScrollView 并且您可以看到由于 UIStackView 约束没有占用所有宽度申请)

Result with stackview contraints

只有当我将标签约束更改为使用 scrollView 时,它才能按预期工作:

textLabel.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

然后结果如预期: enter image description here

为什么会有这种行为?有人可以解释为什么 UIStackView 上的约束没有像我预期的那样工作吗?

完整源代码avaiable at that gist

最佳答案

一切都是正确的。只是您没有指定内容 View (堆栈 View )的宽度。 添加这一行,一切都会完美无缺。

scrollView.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 1).isActive = true;

注意:将 ScrollView 的前导尾随固定到内容 View 不会为内容 View 提供宽度。需要单独的宽度约束,否则内容 View 的宽度将等于其固有宽度。 友情链接:https://stackoverflow.com/a/18341997/1790683

关于ios - UIStackView 可以被约束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40785244/

相关文章:

iphone - Mapkit,如何检测注释已加载

ios - 快速动态添加按钮

ios - 使用 AutoLayout 的最佳实践是什么?

ios - UICollectionView AutoSizingCells 在 reloadData() 上出现奇怪的跳跃/故障

ios - 分配初始化版本

ios - 托管对象上下文作为单例?

ios - 绘制 UIBezierPath 时出现无效内容错误

ios - 在 Swift 4 中用一根手指进行旋转

ios - 更新到 iOS 7 后,iOS 6 中的所有 View 都向上移动并被导航栏隐藏

cocoa - 如何击败框架注入(inject)?