自动布局以编程方式修改约束乘数

如何以编程方式修改约束的乘数? 我已经设置了以下内容:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0]]; 

我需要修改它到这个:

 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:_button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]]; 

正如其他人所说,你必须删除旧的,并添加一个新的。如果你不想把它作为一个属性存储,只需设置标识符和search以便以后得到它

 -(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; } 

然后

  NSLayoutConstraint * constraint = [NSLayoutConstraint constraintWithItem:self.yellowView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0]; constraint.identifier = @"1234"; [self.view addConstraint:constraint]; 

那么你可以得到这个

  NSLayoutConstraint * constraint = [self constraintWithIndientifer:@"1234" InView:self.view]; 

您将无法更改乘数,因为它是只读的。 你将不得不存储对约束的引用。 然后,当你想改变乘数,你会删除约束,并添加一个新的。

你可以在你的视图控制器实现中包含这样的方法:

 - (void)changeMultiplier:(NSLayoutConstraint **)constraint to:(CGFloat)newMultiplier{ NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:(*constraint).firstItem attribute:(*constraint).firstAttribute relatedBy:(*constraint).relation toItem:(*constraint).secondItem attribute:(*constraint).secondAttribute multiplier:newMultiplier constant:(*constraint).constant]; [self.view removeConstraint:(*constraint)]; [self.view addConstraint:newConstraint]; *constraint = newConstraint; } 

相关问题:

我可以更改NSLayoutConstraint乘数属性?

为了修改乘数,我使用约束方法之间的切换。
您必须创build具有不同优先级的约束,否则会破坏布局。

目标C

 NSLayoutConstraint *constraint1, *constraint2; // switch between constraints constraint1.active = NO; constraint2.active = YES; [self.view layoutIfNeeded]; 

Swift 2.0

 self. constraint1.active = true self. constraint2.active = false self.view.layoutIfNeeded()