美文网首页
关于UIScoreView使用自动布局和Masonry布局的注意

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

作者: _RG | 来源:发表于2019-07-22 11:48 被阅读0次

    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 (下图绿色部分为多出来的部分);

    屏幕快照 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为参考,可以将自己固定

    屏幕快照 2019-07-22 上午11.26.06.png

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

    屏幕快照 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布局的注意

          本文链接:https://www.haomeiwen.com/subject/hyeslctx.html