UIView中与AutoLayout相关的几个方法对比

步嘉德
2023-12-01

UIView中有几个关于layout的方法,长的很相似。根据官方文档和网上大部分的说法都难以理解它们有什么实用性,因为都没有给出可以参考的代码。下面是我自己目前简单的理解,以后有新的发现了会再添加进去。

-(void)updateConstraints

用于自定义view的时候重写该方法,向其中添加约束。

-(void)setNeedsUpdateConstraints

官方:Controls whether the view’s constraints need updating. 不清楚这句话有什么实用性。
我的发现:调用该方法,会调用updateConstraints
     在一个UIViewController中执行[self.view setNeedsUpdateContraints]会调用UIViewController中的- (void)updateViewConstraints,在UIViewController中约束的更新写在updateViewConstraints里面,在UIViewController中想要更新约束的话可以使用[self.view setNeedsUpdateContraints]

示例:
1.在alloc init该view的时候,系统会先调用一次updateConstraints,布置好约束。
2.点击_button后触发didTapButton:方法,self.buttonSize发生改变。调用setNeedsUpdateConstraints后系统自动调用updateConstraints,更新约束。
3.最后的layoutIfNeed代码是为了添加动画效果。

- (void)updateConstraints {
    [_button updateConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self);
        make.width.equalTo(@(self.buttonSize.width));
        make.height.equalTo(@(self.buttonSize.height));
        make.width.lessThanOrEqualTo(self);
        make.height.lessThanOrEqualTo(self);
     }];
    //according to apple super should be called at end of method
    [super updateConstraints];
}

- (void)didTapButton:(UIButton *)button {
    self.buttonSize = CGSizeMake(self.buttonSize.width * 1.3, self.buttonSize.height * 1.3);
    
    [self setNeedsUpdateConstraints];
    
    //添加动画效果
    [UIView animateWithDuration:0.4 animations:^{
        [self layoutIfNeeded];
    }];
}
复制代码

-(void)updateConstraintsIfNeeded

官方的说法是:Updates the constraints for the receiving view and its subviews.
应该是说调用该方法会更新view的约束。但是,如果我用代码改变了view的约束,它会是自动的就变了,不需要调用updateConstraintsIfNeeded;我在调用updateConstraintsIfNeeded的时候也没有发现它会调用updateConstraints
所以,暂时没有发现updateConstraintsIfNeeded有什么用。


更新

在网上看见了别人回答问题:UIView中layoutIfNeeded的用法? 的答案:

这个方法和另一个方法配对的,setNeedLayout和layoutIfNeed,还有一个关联的方法是layoutSubviews,在我们没有任何干预的情况下,一个view的fram或bounds发生变化时,系统会设置一个flag给这个view,当下一个渲染时机到来时系统会重新按新的布局来渲染视图。setNeedLayout就是我们主动为这个视图设置一个flag,告诉系统这个视图再下一个时机到来时要重新渲染,而layoutIfNeed则是告诉系统,如果设置了flag那么不用等待时机到来了,直接渲染吧。而layoutSubviews这个方法是系统调用的,我们不需要主动调用,我们只需要调用layoutIfNeed就可以了,让系统判断是否在当前时机下立即渲染。

 类似资料: