以编程方式添加的约束反向工作

Posted

技术标签:

【中文标题】以编程方式添加的约束反向工作【英文标题】:Pogramatically added constraint works in reverse 【发布时间】:2017-09-01 14:52:31 【问题描述】:

添加以下底部约束并将常量设置为 -100 似乎与我在情节提要的约束中添加该常量时完全相反。

具体来说,这会将视图推到控制器底部上方 100 个单位,而预期的行为是使其降低 100 个单位。我很可能犯了一个非常愚蠢的错误,但我现在看不到它。

    func setUp(parentController: UIViewController)

        self.parentController = parentController;

        self.translatesAutoresizingMaskIntoConstraints = false

        self.leftAnchor.constraint(equalTo: parentController.view.leftAnchor).isActive = true
        self.rightAnchor.constraint(equalTo: parentController.view.rightAnchor).isActive = true
        self.heightAnchor.constraint(equalToConstant: pullUpViewHeight).isActive = true

        self.pullUpViewBottomCSTR = self.bottomAnchor.constraint(equalTo: parentController.view.bottomAnchor)
        self.pullUpViewBottomCSTR!.isActive = true;
        self.pullUpViewBottomCSTR!.constant = -100

    

感谢您抽出宝贵时间。

【问题讨论】:

a-bb-a 是彼此的加法倒数。 【参考方案1】:

它始终取决于参与视图/主播的顺序。在设置约束时切换parentController.view.bottomAnchorself.bottomAnchor,一切顺利(因为您想要实现的是parentController 的视图底部等于视图底部减去100 点)。

self.pullUpViewBottomCSTR = parentController.view.bottomAnchor.constraint(equalTo: self.bottomAnchor)

顺便说一句,您可以在创建约束时立即设置常量:

self.pullUpViewBottomCSTR = parentController.view.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -100)

【讨论】:

【参考方案2】:

当我在编写约束时交换视图是否重要,这总是让我感到困惑。答案是,有时重要,有时不重要。

一般:

假设您有 ViewA 和 ViewB,并使用 0 在它们之间设置约束。它们粘在一起。在这种情况下,约束视图的顺序无关紧要。

ViewA 和 ViewB,您使用 20 在它们之间设置约束。它们没有粘在一起。它们之间有一些空格。您希望 ViewA 站稳并移动/推动 ViewB,还是希望 ViewB 站稳并让 ViewA 移动?因此,将约束添加到哪个位置很重要。

如果第一次不起作用,那么我只需切换约束并将其添加到另一个视图中,然后它就可以正常工作了。

【讨论】:

实际上,您并没有将约束添加到参与视图之一,而是它们的共同祖先。 正确,但如何将两个子视图相互约束仍然很重要。

以上是关于以编程方式添加的约束反向工作的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式向 UIView 或 UIViewController 添加约束?

以编程方式添加具有约束的多个子视图会引发异常

以编程方式添加的约束不起作用

以编程方式向已以编程方式添加到表格单元格的标签添加约束

以编程方式添加约束会破坏自动布局约束

反向代理负载均衡之APACHE