在以编程方式设置时无法同时满足约束

时间:2014-08-31 03:32:31

标签: ios objective-c nslayoutconstraint

在我的故事板中,我设置了以下约束。

left side constraint for a view = 9;
right side constraint for a view = 9;
(so I have 9 pixels space on both sides)

这些约束在我的VC中设置为常量。

confirmLocationViewLeftsideConstraint
confirmLocationViewRightsideConstraint

现在,当我的应用程序加载时,我希望此视图关闭屏幕,然后在屏幕上设置动画,以便我通过代码设置约束。

self.confirmLocationViewLeftsideConstraint.constant = 400.0f;
self.confirmLocationViewRightsideConstraint.constant = -409.0f;

但是这会导致应用程序崩溃并出现以下错误:

    Unable to simultaneously satisfy constraints.
        Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
    (

        "<NSLayoutConstraint:0x175f1bb0 H:|-(400)-[UIView:0x175f0080]   (Names: '|':UIView:0x175f1be0 )>",
        "<NSLayoutConstraint:0x1761a6b0 H:[UIView:0x175f0080]-(9)-|   (Names: '|':UIView:0x175f1be0 )>",
        "<NSAutoresizingMaskLayoutConstraint:0x1b387bf0 h=--& v=--& H:[UIView:0x175f1be0(320)]>"
    )

对我来说这是说当右边是9时你不能将confirmLocationViewLeftsideConstraint设置为400但是我上面的下一行代码是将confirmLocationViewRightsideConstraint设置为-409所以它应该可以工作,但是我可以&# 39; t在同一时间设置这两个。

有没有更好的方法来实现滑动视图的开启和关闭?或者在代码中设置它们的更好方法?我需要在故事板中设置布局约束,因为它是一个非常详细的视图,有超过70个约束来保持间距。

1 个答案:

答案 0 :(得分:1)

在我看来,有两个必须同步更新的约束表明你使用了错误的约束。你可以对前缘有一个约束,然后有一个约束使视图的宽度等于超视图的宽度 - 18.这样,你只需要调整前导约束的常量,然后两个边移动。

另一种方法是从superview中删除这两个约束(确保你的引用很强,所以不释放约束),调整它们,然后重新添加它们。

前一种方法使动画更简单,因为您只需要为一个约束的常量设置动画(而不是为布局设置动画)。