如何获取影响给定子视图的自动布局约束?

13
尽管我非常热爱自动布局的概念,但我似乎一直在纠结于其实现细节。其中之一是,我已经厌倦了存储应用于给定子视图的约束条件,以便稍后删除和替换它们。
例如,当我首次添加一个视图时,我可能会为其设置以下约束条件:
@"H:[view(==200)]|"

将其放置在屏幕右侧,宽度为200。如果我想以后将其改为400宽,与200大小的间隔?新布局足够简单,但与旧布局直接相矛盾:

@"H:[view(==200)]-(200)]|"

所以我必须持有约束的数组,以便稍后使用它们来删除这些约束。我肯定是错过了某个更简单的解决方案。不幸的是,[视图约束] 的明显解决方案并不可行,因为您不能直接将约束应用于给定视图,而是将其应用于其父视图。(此外,它往往充满了自动布局约束,这使得它自己的对象适当地适应 -- 这不是你想要删除以调整其位置的内容!)并且似乎没有 [ view constraintsForSubview:] 选项可用。

我是瞎了吗?错过了什么?我真的需要手动处理现有约束的字典才能稍后修复它们吗?

1个回答

20

您可以将IBOutlets设置为约束,并在代码中更改常量参数。因此,如果您试图做的事情类似于您的示例,那么可以像这样实现(调用宽度约束widthCon):

self.widthCon.constant = 400;

如果你想要将约束条件留在右侧为200(如果你想改变那个也可以创造一个出口到那一个)。

如果你想要保存(或删除)某个视图的约束条件,你可以使用类似这样的方法:

for (NSLayoutConstraint *con in self.view.constraints) {
        if (con.firstItem == self.leftButton || con.secondItem == self.leftButton) {
            [self.portraitConstraints addObject:con];
        }
    }

当然,你可以在UIView上创建一个类别,使用类似的方法来制定一个viewConstraintsForView:方法。


谢谢。不幸的是,那个例子是故意编造出来的,因此按照您所述的方式进行修改可能不是最佳选择(尽管我一定会记在心里),但是您提出的那个快速“函数”看起来像是我将要在很多视图控制器中添加的东西。 - RonLugge

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