Masonry使用总结

在使用第三方库Masonry的过程中,遇到过各种各样的坑,以下就把笔者使用过程中的问题总结如下:

  • 控件必须要添加到父view上之后才可以设置约束

  • 一个控件一般需要约束完整,不然会报约束不安全的错误

  • UILabel可以不约束宽高,会根据文本自动填充,

  • 设置TableViewCell的高的时候,可以设置cell的高根据子控件来约束,前提是需要将

 tableView.rowHeight = UITableViewAutomaticDimension;
 tableView.estimatedRowHeight = 40;
  • tableView的tableHeadView和tableFootView不可以使用约束,需要使用设置frame

  • 当设置scrollView的contentSize的时候,可以根据子控件约束其contentSize,使用一个临时变量的View记录最后一个子View,然后设置约束信息

代码示例:

    self.showGreenView = YES;

    UIView *redView = [UIView new];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    
    UIView *orangeView = [UIView new];
    orangeView.backgroundColor = [UIColor orangeColor];
    [redView addSubview:orangeView];
    self.orangeView = orangeView;
    
    UIView *greenView = [UIView new];
    greenView.backgroundColor = [UIColor greenColor];
    [redView addSubview:greenView];
    self.greenView = greenView;
    
    [redView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(0);
        make.top.mas_equalTo(70);
    }];
    
    [self.orangeView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.top.mas_equalTo(10);
        make.bottom.mas_equalTo(-10);
        make.height.mas_equalTo(200);
        make.width.mas_equalTo(100);
    }];
    
    [self.greenView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(self.orangeView.right).offset(10);
        make.top.bottom.mas_equalTo(self.orangeView);
        make.width.mas_equalTo(100);
        make.right.mas_equalTo(-10);
    }];

redView的大小可以通过子控件orangeView来确定height,greenView来确定width

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    self.showGreenView = !self.showGreenView;
    [self.view setNeedsUpdateConstraints];
    [self.view updateConstraintsIfNeeded];
    [UIView animateWithDuration:0.25 animations:^{
        [self.view layoutIfNeeded];
        self.greenView.alpha = self.showGreenView ? 1:0;
    }];
}
- (void)updateViewConstraints {
    [self.orangeView mas_updateConstraints:^(MASConstraintMaker *make) {
        if (self.showGreenView) {
            make.width.mas_equalTo(100);
        } else {
            make.width.mas_equalTo(300);
        }
    }];
    
    [self.greenView mas_updateConstraints:^(MASConstraintMaker *make) {
        if (self.showGreenView) {
            make.width.mas_equalTo(100);
        } else {
            make.width.mas_equalTo(0);
        }
    }];

    [super updateViewConstraints];
}

效果图如下:


Masonry使用总结_第1张图片

你可能感兴趣的:(Masonry使用总结)