20

我有一个视图控制器,我想在 updateViewConstraints 中创建和设置我的视图约束。我在该方法中有一个断点,它永远不会被调用。

为什么它可能不会被调用?框架何时要在我的视图控制器上调用此方法?

4

6 回答 6

16

updateViewConstraintsviewWillLayoutSubviews(通过您的视图的layoutSubviews方法)调用。顾名思义,每当您的视图控制器需要更新其布局时,都会调用它。

如果你发现它updateViewConstraints永远不会被调用,那么你应该确保你super在需要的地方调用你的视图控制器的方法。

另外,听起来好像您正在内部创建约束updateViewConstraints?这也可能是您的问题的原因。您应该在该方法中更新您的约束,而不是创建它们(以与layoutSubviews您定位视图相同的方式,但不要实例化它们)。

于 2013-07-05T21:57:25.240 回答
15

您在 ViewController 中并且希望系统调用updateViewConstraints,那么您必须调用它

[self.view setNeedsUpdateConstraints];
于 2014-09-02T01:20:29.967 回答
14

UIView必须实施+ (BOOL)requiresConstraintBasedLayout并返回YES。在这种情况下,updateViewConstraints最初将调用设置约束。

于 2014-09-23T10:40:06.163 回答
7

只是猜测而不是 100% 确定:

如果您的视图控制器根视图不需要自动布局,则不会调用 updateViewConstraints。因此,您必须至少向根视图添加一个约束(在 loadview 或 viewDidLoad 中的某处)或设置

self.view.translatesAutoresizingMaskIntoConstraints = NO;

这应该触发你的断点。

于 2013-09-15T19:00:28.897 回答
0

你应该打电话setNeedsUpdateConstraints给苹果文件说:

要安排更改,请在视图上调用 setNeedsUpdateConstraints。然后系统会在布局发生之前调用您的 updateViewConstraints 实现。(苹果参考

于 2018-08-08T17:02:00.463 回答
0

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
于 2018-06-14T03:35:57.513 回答