>我有两个宽度约束相等的按钮。我想删除等宽约束并为一个按钮添加新的宽度约束。另一个按钮约束为零。
这就是我尝试过的。但它不起作用。"等宽"约束未删除
NSLayoutConstraint * constraint = [self
constraintWithIndientifer:@"MyButtonWidth" InView:self.view];
[self.view removeConstraint:constraint];
NSLayoutConstraint * newconstraint = [NSLayoutConstraint constraintWithItem:self.departureButton attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1 constant:self.view.frame.size.width];
newconstraint.identifier = @"MyButtonWidth";
[self.departureButton addConstraint:newconstraint];
[self.view layoutIfNeeded];
-(NSLayoutConstraint *)constraintWithIndientifer:(NSString *)identifer InView:(UIView *)view{
NSLayoutConstraint * constraintToFind = nil;
for (NSLayoutConstraint * constraint in view.constraints ) {
if([constraint.identifier isEqualToString:identifer]){
constraintToFind = constraint;
break;
}
}
return constraintToFind;
}
你不需要这样做,
- 您可以将另一个约束(如宽度约束(添加到>=1
- 之后,您应该将"相等约束">优先级设置为1
- 之后,您应该将"宽度约束">优先级设置为2或更多(默认值为1000(
- 之后,当您设置约束常量时,它会起作用,而相等约束由于优先级而不起作用:
self.yourButtonWidthConstraint.constant = yourWidth;
如果您查看 NSLayoutConstraint
的文档,您会发现一个 isActive
属性:
可以通过更改此属性来激活或停用约束。请注意,只有活动约束会影响计算布局。
激活或停用约束将调用 addConstraint: 和 removeConstraint: 视图,该视图是此约束管理的项的最接近的共同祖先。使用此属性,而不是直接调用 addConstraint: 或 removeConstraint: 。
因此,我正在更改示例代码中的removeConstraint
和addConstraint
。aka 只需将您的代码更改为以下内容:
NSLayoutConstraint * constraint = [self
constraintWithIndientifer:@"MyButtonWidth" InView:self.view];
constraint.active = NO; // CHANGE 1
NSLayoutConstraint * newconstraint = [NSLayoutConstraint constraintWithItem:self.departureButton attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1 constant:self.view.frame.size.width];
newconstraint.identifier = @"MyButtonWidth";
newConstraint.active = YES; // CHANGE 2
[self.view layoutIfNeeded];
注意:NSLayoutConstraint
类还有两个类函数:+ activateConstraints:
和 + deactivateConstraints:
,它们都接受一系列约束。当您更改多个约束时,这是首选,但此处不需要,因为它只有 1。
遍历这两个按钮的父视图的约束并删除约束,其中第一项是第一个按钮,第二项是第二个按钮,布局属性是宽度
for (NSLayoutConstraint*co in self.parentOfBtns.constraints)
{
if(co.firstItem==self.btn1&&co.secondItem==self.btn2&&co.firstAttribute==NSLayoutAttributeWidth&co.secondAttribute==NSLayoutAttributeWidth)
[self.parentOfBtns removeConstraint:co];
}
然后添加新的宽度约束,并且不要忘记调用
[self.view layoutIfNeeded];