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

Posted

技术标签:

【中文标题】如何在iOS中以编程方式从UIButton中删除等宽约束【英文标题】:How to remove Equal Width constraint from UIButton Programmatically in iOS 【发布时间】:2018-01-22 14:10:21 【问题描述】:

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

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

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

self.yourButtonWidthConstraint.constant = yourWidth;

【讨论】:

【参考方案2】:

如果您查看the documentation 中的NSLayoutConstraint,您会发现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 个。

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于如何在iOS中以编程方式从UIButton中删除等宽约束的主要内容,如果未能解决你的问题,请参考以下文章

如何在标准 UITableViewCell 中以编程方式自动布局右侧的自定义 UIButton。

如何在 Swift 中以编程方式调整 UIButton 中文本的字体大小以适应宽度?

如何在 iPhone 中以编程方式仅使用一个 UIButton 使用 BCGenieEffect?

如何在 Swift 中以编程方式更改 UIButton 状态

ios工具栏中的UIButton

如何在 UITableView Cell 中以编程方式创建 n 个 UIButton?