自动布局以编程方式修改约束乘数
如何以编程方式修改约束的乘数? 我已经设置了以下内容:
[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()