首先UIScrollview包含自身的frame和contentSize二个部分。frame决定其展示给用户的可见区域,contentSize决定其整个内容的大小。如果frame的宽高小于contentSize,则UIScrollview可以在相应的方向滚动。UIScrollView中有个contentSize属性,如果内容大小是固定的,你可以直接设置contentSize。但是在自动布局约束中我们往往不知道其具体的大小,或者不想计算其大小,在这种情况下我们怎么实现UIScrollView的约束呢?

关于UIScroolView的AutoLayout约束,首先得明白一点,UIScrollView上面的subviews与UIScrollView的top,bottom,left、right约束都是相对于UIScrollview的contentsize,而contentsize大小是不确定的,为了明白的说明这一点,我们看下面代码:

    UIScrollView *verticalScrollView = [[UIScrollView alloc]init];
verticalScrollView.backgroundColor = [UIColor greenColor];
verticalScrollView.pagingEnabled =YES;
// 添加scrollView添加到父视图,并设置其约束
[self.view addSubview:verticalScrollView];
[verticalScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.right.mas_equalTo(-10.0);
make.centerY.equalTo(0);
make.height.mas_equalTo(100);
}];
// 设置scrollView的子视图,即过渡视图contentSize,并设置其约束
UIView *verticalContainerView = [[UIView alloc]init];
[verticalScrollView addSubview:verticalContainerView];
[verticalContainerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.bottom.and.right.equalTo(verticalScrollView).with.insets(UIEdgeInsetsZero); }];
verticalContainerView.backgroundColor = [UIColor redColor];

您觉得最后在屏幕上的verticalScrollView显示的是什么颜色呢?我们先来看答案!

你没眼花,就是绿色的。具体原因是verticalContainerView是verticalScrollView上的一个subView,其相对于verticalScrollView的top,bottom,left、right的约束都是相对于verticalScrollView的contentSize,而contentSize的默认大小为CGSizeZero,因此红色verticalContainerView是完全不能显示的。那么我们怎么让红色的部分显示出来?很简单,我们只需重新约束verticalContainerView,具体代码如下:

    [verticalContainerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.bottom.and.right.equalTo(verticalScrollView).with.insets(UIEdgeInsetsZero); make.width.equalTo(verticalScrollView);
make.height.equalTo(50);
}];

运行结果:

当然,在实际编程中,这样约束,并没有什么实际意义,既然我大小都知道了,直接用frame和contentSize就可以了。其强大性体现在其contentSize会根据verticalContainerView的大小变化而变化,因此我可以在verticalContainerView增加很多subViews,用subViews的内容大小扩充contentSize。具体可见如下的垂直滚动的UIScroolView代码:

    UIScrollView *verticalScrollView = [[UIScrollView alloc]init];
verticalScrollView.backgroundColor = [UIColor greenColor];
verticalScrollView.pagingEnabled =YES;
// 添加scrollView添加到父视图,并设置其约束
[self.view addSubview:verticalScrollView];
[verticalScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(10);
make.right.mas_equalTo(-10.0);
make.centerY.equalTo(0);
make.height.mas_equalTo(100);
}];
// 设置scrollView的子视图,即过渡视图contentSize,并设置其约束
UIView *verticalContainerView = [[UIView alloc]init];
[verticalScrollView addSubview:verticalContainerView];
[verticalContainerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.bottom.and.right.equalTo(verticalScrollView).with.insets(UIEdgeInsetsZero); make.width.equalTo(verticalScrollView);
}];
verticalContainerView.backgroundColor = [UIColor redColor]; UIView *lastView =nil;
for (NSInteger index =0; index <8; index++)
{
UILabel *label = [[UILabel alloc]init];
label.textAlignment =NSTextAlignmentCenter;
label.backgroundColor = [UIColor colorWithHue:(arc4random() %256 / 256.0)
saturation:(arc4random() %128 /256.0) +0.5
brightness:(arc4random() %128 /256.0) +0.5
alpha:1];
label.text = [NSString stringWithFormat:@"第 %ld个视图", index]; //添加到父视图,并设置过渡视图中子视图的约束
[verticalContainerView addSubview:label];
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.and.right.equalTo(verticalContainerView);
make.height.mas_equalTo(60); if (lastView)
{
make.top.mas_equalTo(lastView.mas_bottom);
}
else
{
make.top.mas_equalTo(0);
}
}]; lastView = label;
} [verticalContainerView mas_updateConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(lastView.mas_bottom);
}];

UIScrollView的AutoLayout约束的更多相关文章

  1. 利用代码添加autolayout约束

    1.概述 通常我们通过storyboard能够完成的,代码也能够完成,所以这里介绍下代码实现约束的添加,通常我们不这么干(在不使用第三方框架的情况下,使用系统自带的类添加约束特别繁琐),所以这里仅仅简 ...

  2. 使用代码创建AutoLayout约束

    使用代码创建AutoLayout约束 1.代码创建约束的步骤 2.代码创建约束的常用方法 3.代码创建约束的原则 4.禁用Autoresizing的原因 5. 设置相对状态栏的约束,使用self.to ...

  3. 示例详解:UIScrollview 与 Autolayout 的那点事

    前言 自从写了介绍Masonry那篇文章以后 就一直有人对UIScrollView的那个例子不是很理解 UIView *container = [UIView new]; [scrollView ad ...

  4. UIScrollview 与 Autolayout 的那点事

    原文  http://www.cocoachina.com/ios/20151221/14757.html 前言 自从写了 介绍Masonry 那篇文章以后 就一直有人对UIScrollView的那个 ...

  5. iOS - UIScrollView xib添加约束的坑

    一.Storyboard中的UIScrollView使用自动布局 在使用storyboard和xib时,我们经常要用到ScrollView,还有自动布局AutoLayout,但是ScrollView和 ...

  6. UIScrollView在AutoLayout下的滚动问题

    使用Storyboard编写UI,设置支持AutoLayout. 在其中的一个场景上,添加一个UIScrollView,在对应的代码里增加 - (void)viewDidLoad { [super v ...

  7. AutoLayout 约束与frame、bounds的设置

    介绍 关于AutoLayout的介绍可参考: 使用解读: https://segmentfault.com/a/1190000004386278 iOS 屏幕适配,autoResizing autoL ...

  8. UIScrollView使用autolayout 垂直滚动

    转自:http://dadage456.blog.163.com/blog/static/30310744201491141752716 1.创建一个空白的UIViewController .将UIS ...

  9. Autolayout约束动画化-Animating Autolayout Constraints

    原文:Animating Autolayout Constraints 作者:@kharrison 译者:CocoaChina--起个名字好难(CC论坛ID) 首发:CocoaChina 记于二零一五 ...

随机推荐

  1. Java学习——方法

    在这一次的学习中我觉得首先要了解: 什么是方法呢 方法又怎么定义与调用 上面这段代码是我们经常写到的,其实它就是一个方法,其中 public 是修饰符 void是返回值类型 main就是方法名 arg ...

  2. python爬取post请求Reque Payload的json数据

    import requests,json url = "https://www.yijiupi.com/v31/Product/ListProduct" headers = { ' ...

  3. wpf binging(五) 数据的转换与验证

    1.数据的验证,有时候需要验证同步的数据是否正常 需要派生一个类 ValidationRule 再把这个类指定给binging 进行验证 在这里如果验证不通过 textbox就会变成红色并且发出警告数 ...

  4. 关于第一次在IDEA上使用lombok时注解完全不起作用

    当你第一次在IDEA上使用lombok这个工具包时,如果你没有在setting--->Plugins-->Marketplace-->安装Lombok plugin 同时设置 Set ...

  5. C语言---指针变量详解2

    指针变量保存的是地址,本质上是一个整数,可以进行部分运算,例如加法.减法.比较等,请看下面的代码: #include <stdio.h> int main(){ int a = 10, * ...

  6. ios12更新开发者需要做的

    1.StatusBar内部结构改变 现象:crash crash log: -[_UIStatusBarIdentifier isEqualToString:]: unrecognized selec ...

  7. 3D数学基础(三)矩阵

    3D引擎中对于矩阵的使用非常多,介绍这些知识也是为了告诉开发者原理,更有助于开发者编写逻辑. (1)固定流水线 各种坐标系之间的转化是通过矩阵相乘得到的,这里面就涉及到了3D固定流水线.作为3D游戏开 ...

  8. 增长java中数组的长度

    package month_201711; import java.util.Arrays;/** * 数组长度+1 * @author watchfree * */public class Main ...

  9. python excel 读写

    python操作Excel读写--使用xlrd xlwt python中使用xlrd.xlwt操作excel表格详解

  10. Python学习笔记,day3

    Python学习第三天 一.集合 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作: s = ...