如何在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:。
因此,我将更改您在示例代码中的removeConstraint
和addConstraint
。
也就是把你的代码改成这样:
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?