我已使用代码以编程方式实现了AutoLayout:
- (void)addConstraintWithListNavigationViewController:(UIView *)listViewNavigation y:(CGFloat)y height:(CGFloat)height { //WIDTH_ListTableView = 0.4 //set x = 0; NSLayoutConstraint *constraintToAnimate1 = [NSLayoutConstraint constraintWithItem:listViewNavigation attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:0.00 constant:0]; [self.view addConstraint:constraintToAnimate1]; //set y = y; NSLayoutConstraint *constraintToAnimate2 = [NSLayoutConstraint constraintWithItem:listViewNavigation attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:0.00 constant:y]; [self.view addConstraint:constraintToAnimate2]; //set Width = self.view.frame.size.width*0.4 NSLayoutConstraint *constraintToAnimate3 = [NSLayoutConstraint constraintWithItem:listViewNavigation attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1-WIDTH_ListTableView constant:0.0]; [self.view addConstraint:constraintToAnimate3]; //Set height = height NSLayoutConstraint *constraintToAnimate4 = [NSLayoutConstraint constraintWithItem:listViewNavigation attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.00 constant:height]; [self.view addConstraint:constraintToAnimate4]; }
这很完美,但每次这个ViewController收到一个Notification,它都会运行:
[self.view layoutIfNeeded];
但我想根据连接的布尔变量设置listViewNavigation的宽度.
if(connected){ listViewNavigation.view.frame.size.width = 0.4 * self.view.frame.size.width; } else{ listViewNavigation.view.frame.size.width = 0.6 * self.view.frame.size.width; }
但我不知道如何更新NSLayoutConstraint:
NSLayoutConstraint *constraintToAnimate3 = [NSLayoutConstraint constraintWithItem:PreView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1 - WIDTH_ListTableView constant:0.0]; [self.view addConstraint:constraintToAnimate3];
当此ViewController收到通知时.
解决方法
我认为你有两个选择.
选项1
保留财产
@property (strong,nonatomic)NSLayoutConstraint *constraintToAnimate3;
然后使用此属性
self.constraintToAnimate3 = [NSLayoutConstraint constraintWithItem:PreView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1 constant:-1 * 0.4 * self.view.frame.size.width]; [self.view addConstraint:self.constraintToAnimate3];
当你想改变
if(connected){ self.constraintToAnimate3.constant = -1 *0.6 * self.view.frame.size.width; } else{ self.constraintToAnimate3.constant = -1 *0.4 * self.view.frame.size.width; } [UIView animateWithDuration:yourduration animations:^{ [self.view layoutIfNeeded]; }];
选项2
设置constraintToAnimate3的标识符
constraintToAnimate3.identifier = @"1234"
然后搜索以获得约束
NSLayoutConstraint * constraint3 = nil; NSArray * constraints = self.view.constraints; for (NSLayoutConstraint * constraint in constraints) { if ([constraint.identifier isEqualToString:@"1234"]) { constraint3 = constraint; break; } }
然后更改常量,如Option1所示
更新:
如果在我发布的代码中使用常量
PreView.frame.size.with = self.view.size.width * multiplier + constant