实现updateConstraints的正确方法

Ber*_*rgP 7 objective-c uiview ios nslayoutconstraint

我应该在updateConstraints方法中更新哪些部分约束?我应该更新与我的子类相关的所有约束吗?在我的UIView子类中,我通常添加仅与此子类中定义的子视图相关的约束数组.

@property(nonatomic, strong) NSArray *subclassConstraints;

- (void)updateConstraints {
 [self removeConstraints:self.subclassConstraints];
 self.subclassConstraints = [self createConstraints];
 [self addConstraints:self.subclassConstraints];
 [super updateConstraints];
}
Run Code Online (Sandbox Code Playgroud)

因此,我的约束,超类约束或子类约束之间不会发生任何冲突.

问题是:我应该更新所有self.subclassConstraints吗?或者我应该只更新一些操作后可能不正确的约束?

如果有一些视图属性,有些可以重置它们或分配nil,我认为所有相关的约束都是不正确的,所以我应该在每次- (void)updateConstraints调用时更新该视图的约束 .

FE

@property (nonatomic, strong) UIImageView *imageSubview;


- (void)setImageSubview:(UIImageView *)imageView {
    if (![_imageView isEqual:imageView]) {
        _imageView = imageView;
        [self setNeedUpdateConstraints];
    }
}

- (void)updateConstraints {
    [self removeConstraints:self.imageViewConstraints];
    self.imageViewConstraints = [self createImageViewConstraints];
    [self addConstraints:self.imageViewConstraints];
    [super updateConstraints];
}
Run Code Online (Sandbox Code Playgroud)

那么我应该在updateConstraints方法中更新所有约束吗?或者我应该只更新其中的一些(像imageViewConstraints)

小智 2

最终,这将取决于如何使用自动布局定位视图,以及修改子视图时哪些约束会导致冲突。它会根据具体情况而有所不同。

始终注意每个边缘情况的整体布局如何受到影响,而不仅仅是更改的单个视图。有时只有子视图的约束需要改变,就像你的例子一样。然而,有时整个布局的约束也需要更新。

如果可以的话,仅更改使布局有效所需的约束总是更有效,因为您重用现有约束而不是创建新约束。我所说的改变并不一定意味着只是破坏和重新创造限制。如果可以的话,只需更改使布局有效所需的约束常量值即可。