【问题标题】:Can UIStackView be constrained?可以限制 UIStackView 吗?
【发布时间】:2017-04-08 16:32:32
【问题描述】:

我有一个UIScrollView,它填充了所有窗口,其中包含一个垂直的UIStackView,我想在其中添加填充所有可用宽度的UILabels

UIStackView 被固定到UIScrollView 的所有边缘,我希望它填充所有UIScrollView。但它似乎完全忽略了所有的约束,它的大小只适合它的孩子。为什么会有这种行为?

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

    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 约束不适用)

只有当我更改标签约束以使用 scrollView 时,它才能按需要工作:

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

那么结果如预期:

为什么会有这种行为?有人可以解释为什么UIStackView 的约束不能按我的预期工作?

完整源码avaiable at that gist

【问题讨论】:

  • 嗨 lujop,alignAllCenterX 对您的代码没有影响。你可以删除它。

标签: ios cocoa-touch autolayout uistackview


【解决方案1】:

一切都是正确的。只是您没有指定内容视图(堆栈视图)的宽度。 添加这一行,事情就会完美地工作。

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

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

【讨论】:

  • 感谢@BangOperator。您是否有更多关于为什么需要宽度约束的信息?通常固定到边框就足以确定宽度,不是吗?
  • 是的,滚动视图有点不同。您可以使用自动布局搜索 uiscrollview。我会尽快粘贴相关链接
猜你喜欢
  • 2015-09-09
  • 2015-08-23
  • 2021-05-10
  • 2013-09-24
  • 2016-02-12
  • 2019-03-22
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多