如何从我的父视图中删除所有子视图的约束?

4

我有一个包含多个UIView子视图的UIView,每个子视图都有自己的约束。如何删除子视图的约束?

//only removes the constraints on self.view
[self.view removeConstraints:self.view.constraints];

//I get warning: Incompatible pointer types sending 'NSArray *' to parameter of type 'NSLayoutConstraint'
[self.subview1 removeConstraints:self.subview1.constraints];

你如何为 subview1 添加 约束条件? - mbm29414
它们被添加到了故事板中。我需要通过编程的方式将它们移除。 - iamarnold
subview1是不是self.view的直接子视图? - mbm29414
我该如何检查呢?在Storyboard中,我只是将一个UIView拖入我的视图控制器(父视图)中,并对其应用了一些约束。 - iamarnold
仅仅移除约束条件并不能起到太大的作用。你实际上想要达到什么目标呢? - jrturton
显示剩余2条评论
4个回答

9

尝试这段代码:

for (NSLayoutConstraint *constraint in self.view.constraints) {
    if (constraint.firstItem == self.subview1 || constraint.secondItem == self.subview1) {
        [self.view removeConstraint:constraint];
    }
}

基本上,这个循环遍历了所有分配给self.view的约束,并检查self.subview1是否涉及该约束。如果是,则拉取该约束。


NSLayoutConstraint 是视图与其他 0(零)或 1 个视图之间的关系。 firstItem 是约束关系中的“第一个”项目/视图。如果存在,secondItem 是约束关系中的另一个项目/视图。 - mbm29414
它不行,我得到一个警告:发送'NSArray '到类型为'NSLayoutConstraint'的参数时,指针类型不兼容。当我运行时,它会崩溃并显示错误:**在-[UIView _removeConstraint:]中断言失败:/SourceCache/UIKit_Sim/UIKit-3318.16.14/ NSLayoutConstraint_UIKitAdditions.m:673 ***由于未捕获的异常“NSInternalInconsistencyException”终止应用程序,原因是:“无效参数不满足:[constraint isKindOfClass:[NSLayoutConstraint class]]” 有什么想法吗? - iamarnold
你确定你输入的是 [self.subview1 removeConstraints: 而不是 [self.subview1 removeConstraint: 吗?请确保有 "s"。 - mbm29414
哇塞,加上了那个“s”就解决了问题。非常感谢!我简直无法相信一个“s”会给我带来这么多麻烦。 - iamarnold
抱歉,似乎点赞需要至少15个声望,而我只有6个。当我有足够的声望时,我一定会点赞的。 - iamarnold
显示剩余7条评论

5

你需要移除视图及其子视图的所有约束。因此,创建一个UIView的扩展,然后定义以下方法:

extension UIView {
    func removeAllConstraints() {
        self.removeConstraints(self.constraints)
        for view in self.subviews {
            view.removeAllConstraints()
        }
    }
}

然后调用以下内容:

self.view.removeAllConstraints()

回答晚了,这是用Swift编写的。这可能会对您有所帮助。


0
我采用了@Honey的答案,并对其进行修改,以便视图可以删除与其父视图相关的约束。
extension UIView{

    func removeConstraintsFromAllEdges(){

        if let superview = superview {

            for constraint in superview.constraints{

                if let firstItem = constraint.firstItem, firstItem === self {
                    superview.removeConstraint(constraint)
                }

                if let secondItem = constraint.secondItem, secondItem === self {
                    superview.removeConstraint(constraint)
                }

            }

        }

    }

}

0

我在UIView上编写了一个扩展:

extension UIView{

    func removeConstraintsFromAllEdges(of view: UIView){

        for constraint in constraints{
            if (constraint.firstItem.view == view || constraint.secondItem?.view == view){
                removeConstraint(constraint)
            }
        }
    }

    func addConstraintsToAllEdges(of view: UIView){
        let leading = leadingAnchor.constraint(equalTo: view.leadingAnchor)
        let top = topAnchor.constraint(equalTo: view.topAnchor)
        let trailing = trailingAnchor.constraint(equalTo: view.trailingAnchor)
        let bottom = bottomAnchor.constraint(equalTo: view.bottomAnchor)

        NSLayoutConstraint.activate([leading, top, trailing, bottom])
    }
}

有趣的一点是,secondItemNSLayoutConstraint 的可选属性,而 firstItem 是非可选的。为什么?因为有时您可能需要将视图的高度约束为一个常量值,因此没有涉及到其他视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接