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

时间:2018-01-22 14:10:21

标签: ios objective-c nslayoutconstraint

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

4 个答案:

答案 0 :(得分:1)

您不需要这样做,

  1. 您可以将其他约束(例如宽度约束)添加到> = 1
  2. 在那之后,您应该将“等约束”“ 优先级”设置为1
  3. 在那之后,您应该将“宽度限制” 优先级设置为2或更大(默认为1000)
  4. 在那之后,当您设置约束常量时,它会起作用,并且由于优先级,等约束不起作用:

self.yourButtonWidthConstraint.constant = yourWidth;

答案 1 :(得分:1)

如果您在NSLayoutConstraint中查看the documentation,则会发现isActive属性:

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

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

接下来,我将更改示例代码中的removeConstraintaddConstraint。 也就是将您的代码更改为此:

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。

答案 2 :(得分:0)

循环通过这两个按钮的父视图的约束并删除约束,其中第一个项目是第一个按钮,第二个是第二个按钮,layoutAttribute是宽度

<intent-filter>

然后添加新的宽度约束,不要忘记调用

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

      }

答案 3 :(得分:0)

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;

}

这就是我所做的。但它不起作用。等宽度约束不会删除