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往一个方向滚动时的布局情况进行分析(如竖直方向滚动,或者水平方向滚动)
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为参考,可以将自己固定
竖直方向以scrollerView为参考,可以跟随滚动,
如果竖直方向不以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的高度
水平方向滚动同理