Ios 使用NSLayoutConstraints将视图定位在其superview的边界之外

Ios 使用NSLayoutConstraints将视图定位在其superview的边界之外,ios,objective-c,nslayoutconstraint,Ios,Objective C,Nslayoutconstraint,因此,我有一个名为self.content的超级视图,我在其中添加了两个子视图,分别是self.bg1和self.bg2。最初,我希望self.bg2正好位于self.content的右边界之外。用户应该能够使用按钮调用self.bg2。当点击按钮时,self.bg1移动到其右边缘与self.content左边缘接触的位置。下面是我编写的代码,但它似乎只有在用户从self.bg1切换到self.bg2时才起作用(不向后工作) 在switchToBG1方法中,我有: [self.view remo

因此,我有一个名为
self.content
的超级视图,我在其中添加了两个子视图,分别是
self.bg1
self.bg2
。最初,我希望
self.bg2
正好位于
self.content
的右边界之外。用户应该能够使用按钮调用
self.bg2
。当点击按钮时,
self.bg1
移动到其右边缘与
self.content
左边缘接触的位置。下面是我编写的代码,但它似乎只有在用户从
self.bg1
切换到
self.bg2
时才起作用(不向后工作)

switchToBG1
方法中,我有:

[self.view removeConstraint:[self.bGConstraint objectAtIndex:0]];
self.bGConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[bg1]-[bg2]" options:0 metrics:nil views:self.viewsDictionary];
[self.view addConstraints: self.bGConstraint];
类似地,在
开关TOBG2
中:

[self.view removeConstraint:[self.bGConstraint objectAtIndex:0]];
self.bGConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[bg1]-[bg2]|" options:0 metrics:nil views:self.viewsDictionary];
[self.view addConstraints: self.bGConstraint];
最后,在一个
ui视图动画中需要
layoutifneed
,持续时间…

*编辑: 从BG1切换到BG2(即从左到右)时的动画成功执行,没有任何错误,但当我尝试从右到左(BG2返回到BG1)时,系统向我抛出一条
无法同时满足约束的错误消息。
错误消息


我做错了什么?提前谢谢

您所做的看起来是正确的想法,因此您的约束交换逻辑可能有问题,这会导致第二个约束中的某些内容与第一组约束中已经存在的内容冲突。要轻松防止这种情况发生,请按以下方式进行构造:

首先,存储一个属性中一个位置的所有约束
bg1
bg2
,以及另一个属性中另一个位置的所有约束。现在到了交换的时候,把所有旧的都换掉,把所有新的都换进去。这样你就不会把自己弄糊涂了,而且保证了你的一致性


换句话说,只切换一个约束的代码太聪明了。最好保持它的简单和愚蠢(并且让它正确工作)

不要
删除约束:[self.bGConstraint objectAtIndex:0]
。每次都完全交换约束,即
移除约束:self.bGConstraint
。您是否进行了测试,以确保
switchToBG1
switchToBG2
实际上是交替调用的?@matt感谢您的回答,但仍然不起作用:(是的,我有大量的日志记录声明:DWe仍在打基础。我还没有回答!我只是让你看看可能的问题。你做的事情是正确的,所以当你发现它时,它会变得非常简单和愚蠢。在日志记录区域,它还说
无法同时满足con要求。)紧张。
回答得很好,就像……想帮忙吗?:P谢谢你的朋友,我真的很感激!
[self.view removeConstraint:[self.bGConstraint objectAtIndex:0]];
self.bGConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[bg1]-[bg2]|" options:0 metrics:nil views:self.viewsDictionary];
[self.view addConstraints: self.bGConstraint];