如何在iOS中以编程方式从UIButton中删除等宽约束



>我有两个宽度约束相等的按钮。我想删除等宽约束并为一个按钮添加新的宽度约束。另一个按钮约束为零。

这就是我尝试过的。但它不起作用。"等宽"约束未删除

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. 之后,您应该将"相等约束">优先级设置为1
  3. 之后,您应该将"宽度约束">优先级设置为2或更多(默认值为1000(
  4. 之后,当您设置约束常量时,它会起作用,而相等约束由于优先级而不起作用:

self.yourButtonWidthConstraint.constant = yourWidth;

如果您查看 NSLayoutConstraint 的文档,您会发现一个 isActive 属性:

可以通过更改此属性来激活或停用约束。请注意,只有活动约束会影响计算布局。

激活或停用约束将调用 addConstraint: 和 removeConstraint: 视图,该视图是此约束管理的项的最接近的共同祖先。使用此属性,而不是直接调用 addConstraint: 或 removeConstraint: 。

因此,我正在更改示例代码中的removeConstraintaddConstraint。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];

最新更新