【问题标题】:Expend components programatically for Auto Layout以编程方式为自动布局扩展组件
【发布时间】:2018-10-01 11:53:27
【问题描述】:

我有一个包含三个组件的视图。在界面生成器中,我将所有三个设置为相同的宽度。

在代码中,我想在某些条件下隐藏中间组件,然后花费其余两个来占用额外的空间。我试图将中间组件的宽度约束暴露给代码,然后将约束的“常量”属性设置为 0,这不起作用。

谁能告诉我是否有一种简单的方法可以实现我的目标?

谢谢

Please see the attached screen mockup for the idea

【问题讨论】:

  • 你已经为宽度自动布局约束设置了一个出口?您可以读取调试器中的值以确保您的插座连接正确吗?另外,请确保在进行更改后调用“layoutIfNeeded()”:stackoverflow.com/a/42669920/3708242
  • 我已经做到了。似乎这仅在我们将宽度设置为固定值时才有效。乘数不能以这种方式工作。

标签: ios autolayout constraints expand


【解决方案1】:

您是否考虑过将所有三个组件都嵌入到 UIStackview 中?您可以将分布设置为 fillEqually ,然后使用 removeArrangedSubView 来执行您所说的操作。不用担心约束。这是一个非常简单的示例(只需在情节提要上放置一个堆栈视图和按钮):

class ViewController: UIViewController {

    @IBOutlet weak var stackView: UIStackView!

    let view1 = UIView()
    let view2 = UIView()
    let view3 = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        stackView.distribution = .fillEqually

        view1.backgroundColor = .red
        stackView.addArrangedSubview(view1)

        view2.backgroundColor = .green
        stackView.addArrangedSubview(view2)

        view3.backgroundColor = .blue
        stackView.addArrangedSubview(view3)
    }

    @IBAction func remove(_ sender: Any) {
        stackView.removeArrangedSubview(view2)
    }
}

【讨论】:

  • 解决了我的问题。谢谢。以前从未想过使用 UIStackView。
  • @Joe Stack 视图是快速精简的完美解决方案。但是,如果你想控制整个动画——中间视图消失的速度和时间以及外部视图扩展的速度和时间——使外部视图实例属性的宽度约束,动画中间视图的 alpha为 0,然后在完成处理程序中,更新约束并对 containerView.layoutIfNeeded() 进行动画处理。但我是个控制狂。
  • 我有一个解决方案,对您现有的实施进行了最小的更改。您无需更改将中间视图宽度约束更改为 0 的代码。您只需从中间视图中删除等宽关系。只让左右视图的宽度相等。现在在这种情况下,您的中间视图可以在需要时将其设置为 0 或总宽度/3。快速解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-16
  • 2015-09-12
相关资源
最近更新 更多