我有一个视图控制器,我想在 updateViewConstraints 中创建和设置我的视图约束。我在该方法中有一个断点,它永远不会被调用。
为什么它可能不会被调用?框架何时要在我的视图控制器上调用此方法?
我有一个视图控制器,我想在 updateViewConstraints 中创建和设置我的视图约束。我在该方法中有一个断点,它永远不会被调用。
为什么它可能不会被调用?框架何时要在我的视图控制器上调用此方法?
updateViewConstraints
由viewWillLayoutSubviews
(通过您的视图的layoutSubviews
方法)调用。顾名思义,每当您的视图控制器需要更新其布局时,都会调用它。
如果你发现它updateViewConstraints
永远不会被调用,那么你应该确保你super
在需要的地方调用你的视图控制器的方法。
另外,听起来好像您正在内部创建约束updateViewConstraints
?这也可能是您的问题的原因。您应该在该方法中更新您的约束,而不是创建它们(以与layoutSubviews
您定位视图相同的方式,但不要实例化它们)。
您在 ViewController 中并且希望系统调用updateViewConstraints
,那么您必须调用它
[self.view setNeedsUpdateConstraints];
您UIView
必须实施+ (BOOL)requiresConstraintBasedLayout
并返回YES
。在这种情况下,updateViewConstraints
最初将调用设置约束。
只是猜测而不是 100% 确定:
如果您的视图控制器根视图不需要自动布局,则不会调用 updateViewConstraints。因此,您必须至少向根视图添加一个约束(在 loadview 或 viewDidLoad 中的某处)或设置
self.view.translatesAutoresizingMaskIntoConstraints = NO;
这应该触发你的断点。
你应该打电话setNeedsUpdateConstraints
给苹果文件说:
要安排更改,请在视图上调用 setNeedsUpdateConstraints。然后系统会在布局发生之前调用您的 updateViewConstraints 实现。(苹果参考)
updateViewConstraints
如果添加标志来指示是否已添加约束,则可以添加约束。另见我的要点
@implementation ViewController {
bool _constraintsAdded;
}
- (void)updateViewConstraints {
if (!_constraintsAdded) {
_constraintsAdded = true;
// TODO: add constraints to self.view's subviews
}
NSLog(@"update constraint.");
// TODO: update constraints needed
[super updateViewConstraints]; // must be called finally.
}
@end