关于UIScoreView使用自动布局和Masonry布局的注意点

UIScoreView进行布局

关于刘海屏系列滑动安全区域的问题: 如果没有使用下面代码设置安全区域

  [UITableView appearance].estimatedRowHeight = 0;
  [UITableView appearance].estimatedSectionHeaderHeight = 0;
  [UITableView appearance].estimatedSectionFooterHeight = 0;
    
  if (@available(iOS 11, *)) {
        [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; //iOS11 解决SafeArea的问题,同时能解决pop时上级页面scrollView抖动的问题
   }

且scrollView布局在屏幕最底部,会出现contentSize大于实际设置的contentSize (下图绿色部分为多出来的部分);

关于UIScoreView使用自动布局和Masonry布局的注意点_第1张图片
屏幕快照 2019-07-22 上午9.47.58.png

下面开始记录自己布局中的一些问题,

这里只针对UIScoreView往一个方向滚动时的布局情况进行分析(如竖直方向滚动,或者水平方向滚动)

1 : UIScoreView的滚动的条件
必须是UIScoreView的width < contentSize的宽度 (水平方向滚动)
或UIScoreView的height < contentSize的宽度 (竖直方向滚动)
注意: 等于是不能使UIScoreView进行滚动的

如果是竖直方向滚动

布局时左右方向要固定, 也就是左右方向不能以UIScoreView为参考进行布局

而顶部或者底部要以UIScoreView为参考,否则竖直方向被固定的话则无法滚动

- (void)addSubviews {
    
    self.contentView = [UIView new];
    self.contentView.backgroundColor = [UIColor whiteColor];
    [self addSubview:self.contentView];
    [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.leading.trailing.bottom.mas_equalTo(self);
        make.height.mas_equalTo(199);
    }];
    
    
    self.bottomView = [UIView new];
    self.bottomView.backgroundColor = [UIColor redColor];
    [self.contentView addSubview:self.bottomView];
    [self.bottomView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.leading.trailing.bottom.mas_equalTo(self.contentView);
        make.height.mas_equalTo(50);
    }];
    
    
    self.testScrollView = [UIScrollView new];
    self.testScrollView.backgroundColor = [UIColor greenColor];
    [self.contentView addSubview:self.testScrollView];
    [self.testScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.leading.trailing.top.mas_equalTo(self.contentView);
        make.bottom.mas_equalTo(self.bottomView.mas_top);
    }];
    
    self.scrollViewSubView01 = [UIView new];
    self.scrollViewSubView01.backgroundColor = [UIColor orangeColor];
    [self.testScrollView addSubview:self.scrollViewSubView01];
    [self.scrollViewSubView01 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(self.testScrollView);
        make.trailing.leading.mas_equalTo(self.contentView);
        make.height.mas_equalTo(50);
    }];
    
    
    self.scrollViewSubView02 = [UIView new];
    self.scrollViewSubView02.backgroundColor = [UIColor purpleColor];
    [self.testScrollView addSubview:self.scrollViewSubView02];
    [self.scrollViewSubView02 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.leading.trailing.mas_equalTo(self.contentView);
        make.top.mas_equalTo(self.scrollViewSubView01.mas_bottom);
        make.height.mas_equalTo(100);
    }];

    self.testScrollView.contentSize = CGSizeMake(0, 150);
    
}

这里左右方向以一个固定的view为参考,可以将自己固定

关于UIScoreView使用自动布局和Masonry布局的注意点_第2张图片
屏幕快照 2019-07-22 上午11.26.06.png

竖直方向以scrollerView为参考,可以跟随滚动,

关于UIScoreView使用自动布局和Masonry布局的注意点_第3张图片
屏幕快照 2019-07-22 上午11.28.06.png

如果竖直方向不以scrollerView为参考,而是以其他view为参考布局, 则会把自己给固定死,不能随着scrollview的滑动而滚动, 原因是 scrollerView里面的view进行滚动, 实际是内部修改了scrollerView的bounds.origin, 内部子View的位置都是根据scrollerView的bounds.origin来进行移动的。

注意: 如果水平方向和竖直方向都以scrollerView进行布局,则不会布局成功, 子View的size会是{0,0};

对于控件比较多且动态变化的UIscrollView, 注意一个view不要使用两次mas_makeConstraints 进行布局, 否则会重复添加约束,而导致约束不正确, 第二次重新布局时可以使用mas_remakeConstraints重新布局某个view的约束, 或者使用mas_updateConstraints跟新view的某个约束

总结: 如果是竖直方向滚动, 则竖直方向以scrollerView为参考进行布局
水平方向则以其他view进行布局固定, contentsize.width > scrollerView的高度
水平方向滚动同理

你可能感兴趣的:(关于UIScoreView使用自动布局和Masonry布局的注意点)