如何在UIButtons之间以编程方式获取NSLayoutConstraint?

时间:2013-07-10 09:09:43

标签: iphone ios cocoa-touch uibutton nslayoutconstraint

在视图中我正在插入一个新的UIButton,因为我一直在使用AutoLayout,我需要得到下面的视图的约束,我将要插入按钮。如何以编程方式获取NSLayoutConstraint,以便我可以删除之后创建新约束的旧约束。感谢名单。

编辑:enter image description here

参考图表,我需要在B1和B2之间插入B3,所以我需要删除已经设置的B1和B2之间的固定空间约束,我需要将B3底部连接到B2的顶部,将B3的顶部连接到B1的底部

2 个答案:

答案 0 :(得分:2)

  

我需要删除已经设置的B1和B2之间的固定空间约束

以编程方式查找约束

您可以在视图约束中搜索B1,也可以在创建时保留对NSLayoutConstraint的引用。搜索B1的约束可能效率较低:所有关系约束(查看另一个视图)都是封闭superview的一部分。假设您有B1的句柄,您可以在其超级视图中列出所有B1约束,如下所示:

// Searching all relationship constraints involving b1
for item in self.view.constraints() {
    if let constraint = item as? NSLayoutConstraint {
        if let button = constraint.firstItem as? UIButton {
            if button == b1 {
                println("firstItem found: \(constraint)")
            }
        }
        if let button = constraint.secondItem as? UIButton {
            if button == b1 {
                println("secondItem found: \(constraint)")
            }
        }
    }
}

记住约束

到目前为止,更干净的方法是保留对您想要稍后修改或删除的NSLayoutConstraint的引用。要在Storyboard中执行此操作,请创建所需的约束。

enter image description here

然后控制 - 将引用直接拖到源文件中以便以后操作它们。

enter image description here

答案 1 :(得分:0)

您可以关闭应用于视图的默认约束,如下所示。在第一次创建按钮程序时应用下面的代码。

B1.translatesAutoresizingMaskIntoConstraints = NO;
B2.translatesAutoresizingMaskIntoConstraints = NO;
B3.translatesAutoresizingMaskIntoConstraints = NO;

使用AddSubView将所有按钮添加到您的视图中后,再次将您的Constrain设置为您的需要,如下所示。

// Center the middle one vertically
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:B2 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0]];

希望它能帮助您在Stack Overflew中找到最佳答案 Evenly space multiple views within a container view  最好的。