scrollView 纯代码布局。
- 纯代码布局分为两种情况
------①scrollView 的子控件有着固定的bounds;
------②scrollView 的子控件使用自动布局设置约束,其大小尺寸会随数据变化。
(不管以上那种情况,scrollView本身的frame一定要设置ok,可以使用frame直接设置,也可以使用自动布局设置。)
==case 1:子控件的 bounds 固定
已经说过,scrollView之所以能够滚动,是其contentOffset的功劳。所以关于scrollView的纯代码布局,还是分为两种:
第一种是直接设置scrollView本身的contentOffset。
第二种可以理解为分为三步:
-
step1,设置scrollView本身的大小;
-
step2,设置它的内容比它本身大,也就是size;
-step3,设置它的四边(Edges)到它内容视图的四边相等。
那么问题来了,如果我们给一个scrollView塞进去很多小的视图,如何确定其view们的四边?这里有一个技巧,就是给scrollView添加一个唯一直接子视图。啥意思呢,通俗点说就是创建一个view设置其大小(直接设置frame或者使用autolayout设置皆可),然后将其添加到scrollView的子视图,其他七七八八的所有小子视图都添加在这个直接子视图中,这个直接子视图就相当于contentView。这样只要设置这个直接子视图的大小和约束就好了。
再加一句,scrollView遇到导航栏的时候,会默认下移64,即scrollView的contentOffsetY + 64 (经测试知其高度不变,很多情况下会包含64,所以要根据实际情况设置“直接子视图”的size)。
如果设置好了这个直接子视图的约束,那么这个直接子视图的范围就是scrollView的滚动范围喽。
需要注意一下,scrollview必须要设置明确的大小和位置!意思就是不管是直接设置scrollview还是依赖其它控件设置,必须明确知道其位置和大小,不能跟随别的控件变化而变化,否则其直接子视图就不能确定,也就无法通过滚动来显示内部的若干控件了。
(代码还没来得及上,待续……)
==case 2:子控件的 bounds 变化
开始跟 case 1 的设置一样,先要有一个“直接子控件 vSize”;
在 case 2 中,vSize 的控件们是通过自动布局约束的,反映到 vSize 上就是 vSize 的尺寸不固定。
so,此时对 vSize 的布局为(直接上代码):
水平方向和竖直方向全动态的。也就是说这两个方向都会随内容而自动撑开大小。
[vsize mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.svInfo);
make.left.equalTo(self.svInfo);
make.centerY.equalTo(self.svInfo);
}];
image
这里像这样给一个 left,一个 centerY;高度 height 可以自适应,right 也可以自适应,对 scrollView 的滚动和滚动范围都没有影响!
当然,上面的布局方法是一种水平方向和竖直方向全动态的。也就是说这两个方向都会随内容而自动撑开大小。
下面就介绍另一种,水平或者竖直某一个方向自动撑开,另一个方向固定的方法:
(1)水平固定,竖直方向自动撑开
[vsize mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.svInfo);
mark.top.equalTo(self.svInfo); //上方固定
make.left.right.equalTo(self.svInfo); //左右固定(宽度固定)
}];
(2)水平方向自动撑开,竖直方向固定
[vsize mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.svInfo);
make.left.equalTo(self.svInfo); //左侧固定
make.top.bottom.equalTo(self.svInfo); //上下固定(高度固定)
}];
如此设置布局是不是很方便呢?
--
网友评论