我使用storyboard
和autolayout
,并在相应的视图控制器中将IB中的约束设置为IBOutlet
。我正在阅读几篇关于如何更新纵向和横向不同的约束的帖子,但我还不确定我该怎么做:
-viewWillTransitionToSize:withTransitionCoordinator:
方法或updateViewConstraints
方法中设置新约束吗?[self.view setNeedsUpdateConstraints];
,layoutIfNeeded
还是setNeedsLayout
?我应该如何更新某个约束的常量:
self.myConstraint.constant = 30.0
或做:
[self.view removeConstraint:self.passwordViewHeight];
self.passwordViewHeight = [NSLayoutConstraint constraintWithItem:self.passwordView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:34.0];
[self.view addConstraint:self.passwordViewHeight];
提前致谢
答案 0 :(得分:2)
使用viewWillTransitionToSize方法检测方向更改。当设备方向即将改变时,将调用此方法。
D
或者,如果要在方向更改后更改约束,请在viewWillTransitionToSize方法中使用协调器对象的animateAlongsideTransition方法。
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator (id<UIViewControllerTransitionCoordinator>)coordinator{
//change constraints
}
答案 1 :(得分:0)
最好的方法是更改常量而不是删除约束并再次重新创建它。从长期来看,仅增加或减去常数也要快得多。你想要做的是:
[self.view layoutIfNeeded];
self.myConstraint.constant = 30.0;
[self.view layoutIfNeeded];
建议您在更改常量之前和之后调用layoutIfNeeded。这是因为在更改更多约束之前,您可能会有一些尚未完成的约束,然后会这样做。
答案 2 :(得分:0)
最好的想法是在Interface Builder中使用Size Classes
来实现自转变化。
https://www.codefellows.org/blog/size-classes-with-xcode-6-one-storyboard-for-all-sizes