以编程方式使用自动布局约束的问题

Posted

技术标签:

【中文标题】以编程方式使用自动布局约束的问题【英文标题】:Issue using Auto Layout Constraints Programmatically 【发布时间】:2016-10-20 16:11:07 【问题描述】:

我有这种情况:

我想要这个:

黑色视图位于紫色视图之间的 X 距离处,如果我在紫色视图中点击 I 按钮,紫色视图的高度会减小(或增加),我希望黑色视图与紫色视图之间的 X 距离相同。 出于这个原因,我写了这段代码:

对于增加或减少紫罗兰视野的按钮事件,我使用这种方法:

@IBAction func tapOpenButton()

      self.altezza.constant = self.altezza.constant + 20

    
    @IBAction func tapCloseButton()

        self.altezza.constant = self.altezza.constant - 20

    

其中altezzaNSLayoutConstraint

两个视图都在滚动视图中,我通过代码设置约束:

var newView = blackView
    var view = violetView
         let horizontalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerX, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerX, multiplier: 1, constant: 0)

            let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.centerY, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.centerY, multiplier: 1, constant: 120)
                       let widthConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)
            let heightConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)

        self.altra.addConstraints([horizontalConstraint,verticalConstraint, widthConstraint, heightConstraint])

altra 是两个视图所在的滚动视图

我的问题是当我减少或增加紫罗兰的高度时,紫色视图和黑色视图之间的距离是不一样的,特别是,例如,当我增加紫色视图的高度时,紫色视图在黑色视图下方。 我是代码自动布局的新手。 你能帮帮我吗?

【问题讨论】:

【参考方案1】:

检查这是否可以代替您的 heightContaint

let heightConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100)

【讨论】:

【参考方案2】:

不要将视图固定在centerY 上,而是将黑色视图的顶部设置为带有边距的紫色视图的底部。

let verticalConstraint = NSLayoutConstraint(item: newView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: view, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 10)

【讨论】:

以上是关于以编程方式使用自动布局约束的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局约束以编程方式创建四个具有相同高度和宽度的 UIView

以编程方式从超级视图中删除视图后更新约束/框架(自动布局)

以编程方式为不同大小类创建具有不同常量的自动布局约束

模糊自动布局约束(以编程方式添加)

以编程方式使用自动布局添加许多按钮以查看 X、Y、填充约束

以编程方式使用自动布局约束在视图中垂直对齐中间的子视图