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

时间:2014-08-07 15:02:15

标签: ios objective-c nslayoutconstraint

所以我有一个名为self.content的超级视图,我正在为它添加2个子视图,分别是self.bg1self.bg2。最初,我希望self.bg2位于self.content的右边界之外。用户应该能够使用按钮拨打self.bg2。点击按钮时self.bg1移动到一个位置,使其右边缘触及self.content的左边缘。这是我编写的代码,但它似乎仅在用户从self.bg1切换到self.bg2时才起作用(不向后工作)

//BG1
self.bg1 = [[UIView alloc]init];
[self.bg1 setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.content addSubview:self.bg1];

//BG2
self.bg2 = [[UIView alloc]init];
[self.bg2 setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.content addSubview:self.bg2];

self.viewsDictionary = @{@"bg1":self.bg1,
                         @"bg2":self.bg2};
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"H:[bg1(%f)]",self.view.frame.size.width] options:0 metrics:nil views:self.viewsDictionary]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[bg1]|" options:0 metrics:nil views:self.viewsDictionary]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"H:[bg2(%f)]",self.view.frame.size.width] options:0 metrics:nil views:self.viewsDictionary]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[bg2]|" options:0 metrics:nil views:self.viewsDictionary]];
//self.bGConstraint is an NSArray
self.bGConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[bg1]-[bg2]" options:0 metrics:nil views:self.viewsDictionary];
[self.view addConstraints: self.bGConstraint];

我用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];

同样在switchToBG2

[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];

layoutIfNeeded

中的最后UIView AnimationWithDuration...

*编辑: 从BG1切换到BG2(即从左到右)的动画成功执行,没有任何错误,但是当我尝试从右向左(BG2回到BG1)时系统抛出Unable to simultaneously satisfy constraints.错误消息

我在这里做错了什么?提前谢谢!

1 个答案:

答案 0 :(得分:1)

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

预先存储所有 一个属性中一个位置bg1bg2的约束,以及所有另一个属性中为其他位置定位它们的约束。现在,当交换时,交换所有旧的并交换所有新的。这样你就不会那么困惑自己,并保证你的一致性。

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