前一段时间由于视图需要旋转,所以使用约束进行布局,同时又需要对视图进行旋转,想要的结果是在旋转之后,能够根据设置的布局再次布局,但是没有再次布局。
先上最后的效果
实现代码如下
布局代码
- (NSLayoutConstraint *)addConstraintForView:(UIView *)subView inView:(UIView *)view constraint:(NSMutableArray *)contraints
{
//使用Auto Layout约束,禁止将Autoresizing Mask转换为约束
[subView setTranslatesAutoresizingMaskIntoConstraints:NO];
NSLayoutConstraint *contraint1 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0];
NSLayoutConstraint *contraint2 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0];
NSLayoutConstraint *contraint3 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:-10.0];
//子view的右边缘离父view的右边缘40个像素
NSLayoutConstraint *contraint4 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeHeight multiplier:1.0 constant:-10.0];
self.height = contraint4;
NSLayoutConstraint *contraint5 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeHeight multiplier:1.0 constant:-10.0];
//子view的右边缘离父view的右边缘40个像素
NSLayoutConstraint *contraint6 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:-10.0];
_p = @[contraint3, contraint4];
_l = @[contraint5, contraint6];
//把约束添加到父视图上
NSArray *array = [NSArray arrayWithObjects:contraint1, contraint2, contraint3, contraint4, contraint5, contraint6, nil];
if (contraints)
{
[contraints addObjectsFromArray:array];
}
[view addConstraints:array];
[NSLayoutConstraint deactivateConstraints:_l];
return contraint3;
}
旋转的时候
- (IBAction)fdsfasdf:(id)sender
{
[NSLayoutConstraint deactivateConstraints:_p];
[NSLayoutConstraint activateConstraints:_l];
[UIView animateWithDuration:1 animations:^{
self.testView.transform = CGAffineTransformMakeRotation(M_PI_2);
}completion:^(BOOL finished) {
NSLog(@"%d__%d__%@__%@", __LINE__, [self.testView needsUpdateConstraints], NSStringFromCGRect(self.testView.frame), NSStringFromCGRect(self.view.frame));
}];
NSLog(@"%d__%d", __LINE__, [self.testView needsUpdateConstraints]);
[self.testView updateConstraintsIfNeeded];
}
最终发现是只有在frame发生改变的时候才能够重新布局,而出现上述问题的原因在于,布局的参照视图没有发生旋转,而布局的视图发生旋转,这样就造成参照出错。