【原】Masonry+UIScrollView的使用注意事项

本文转载请注明出处 —— polobymulberry-博客园

1.问题描述

我想实现的使用在一个UIScrollView依次添加三个UITableView(tableView1、tableView2、tableView3)。最后想达到的效果就像下图这样:

或者用这张图更形象点:

然后我的代码大概的样子

// 自定义了一个UIScrollView为ICScrollView
// 在ViewController中添加到self.view中
// ViewController.m
- (void)viewDidLoad {
// ...
[self.view addSubview:self.scrollView];
// ...
} - (ICScrollView *)scrollView
{
// ...
if (_scrollView == nil) {
_scrollView = [[ICScrollView alloc] init];
_scrollView.contentSize = CGSizeMake(width, height);
}
// ...
} // 然后我在ICScrollView中重载了init函数
// ICScrollView.m
- (instancetype)init
{
self = [super init];
if (self) {
[self addSubview:self.tableView1];
[self addSubview:self.tableView2];
[self addSubview:self.tableView3]; [self layoutScrollSubViews];
}
return self;
} - (void)layoutScrollSubViews
{
[self.tableView1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(self.size);
make.leading.mas_equalTo(self.mas_leading);
make.top.mas_equalTo(self.mas_top);
}]; [self.tableView2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(self.size);
make.leading.mas_equalTo(self.tableView1.mas_trailing);
make.top.mas_equalTo(self.mas_top);
}]; [self.tableView3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(self.size);
make.leading.mas_equalTo(self.tableView2.mas_trailing);
make.top.mas_equalTo(self.mas_top);
}];
}

上述代码用Masonry给要添加到scrollView上的3个tableView添加了约束。但是当我显示的时候,发现三个tableView确实是初始化了,也添加到scrollView上了,但是宽度和高度均为0。问题就是我约束都设置好了,为什么还会出现问题?

2.问题分析

出现使用autolayout后,view的宽高均为0。很可能是因为约束设置出错。搜索了无数文章,尝试了无数可能后,我觉得问题很可能处在scrollView上。所以我搜索autolayout+UIScrollView,还真发现了UIScrollView在Autolayout使用下的一些问题。最主要的问题就是:

当我使用make.leading.mas_equalTo(self.mas_leading) 的时候,其实这里的self.mas_leading指的是scrollView的contentSize的那个leading。

有没有发现,此时我的contentSize还没有指定,因为他是我在_scrollView = [[ICScrollView alloc] init]; 后面添加的,而此时约束已经完成了。所以最简单的办法是把_scrollView.contentSize = CGSizeMake(width, height); 放到layoutScrollSubViews之前,就可以啦!具体按照你的代码习惯添加吧。

3.参考文章

  1. AutoLayout深入浅出三[相遇Scrollview]
  2. UIScrollView 实践经验

【原】Masonry+UIScrollView的使用注意事项的更多相关文章

  1. Masonry UIScrollView autolayout 的一个奇特的问题

    事情是这样的.... 我一个工程里 一直使用的 masonry 做autolayout,有个gesturerReconizer的bug,找了很久,发现很奇怪一个现象: 我的某个view 是这样的 |- ...

  2. Mac系统如何编辑hosts文件

    Mac系统如何编辑hosts文件 Hosts 是一个没有扩展名的系统文件,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系 统会首先 ...

  3. day 3 大纲笔记

    01 昨日内容回顾 while 条件: 循环体 如何终止循环: 1,改变条件. 2,break. 3,exit() quit() 不推荐. 关键字: break continue while else ...

  4. iOS autoLayout总结

    本文转自 http://ruikq.github.io/ios/autolayout/uiscrollview/2015/01/27/iOS-autolayout%E6%80%BB%E7%BB%93. ...

  5. 四、Linux学习之文件处理命令

    1.建立目录:mkdir 格式:mkdir –p [目录名] -p     递归创建目录 注意事项: 如果是创建单个目录直接mkdir [目录名就可以] 如果是创建一个目录下的目录也就是递归创建目录请 ...

  6. 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略

    原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...

  7. java-day02

    数据类型自动转换 要求:数据范围从小到大 数据类型强制类型转换 格式:范围小的数据类型 范围小的变量名 = (范围小的数据类型)原范围大的数据 注意事项: 1.可以会造成数据溢出或者是精度损失. 2. ...

  8. Masonry使用注意事项

    1 理解自身内容尺寸约束与抗压抗拉 自身内容尺寸约束:一般来说,要确定一个视图的精确位置,至少需要4个布局约束(以确定水平位置x.垂直位置y.宽度w和高度h).但是,某些用来展现内容的用户控件,例如文 ...

  9. 使用Masonry对UIScrollView自动布局

    之前使用Masonry对UIScrollView进行过约束,当时是遇到了问题的,怎么约束都不对,因为赶进度直接改用frame了也没有对问题深究.就这样过了很久.........,直到前一段换工作的时候 ...

随机推荐

  1. 【AR实验室】ARToolKit之制作自己的Marker/NFT

    0x00 - 前言 看过example后,就会想自己动动手,这里改改那里修修.我们先试着添加自己喜欢的marker/nft进行识别. 比如我做了一个法拉利的marker: 还有网上找了一个法拉利log ...

  2. Apache Ignite高性能分布式网格框架-初探

    Apache Ignite初步认识 今年4月开始倒腾openfire,过程中经历了许多,更学到了许多.特别是在集群方面有了很多的认识,真正开始认识到集群的概念及应用方法. 在openfire中使用的集 ...

  3. 在离线环境中发布.NET Core至Windows Server 2008

    在离线环境中发布.NET Core至Windows Server 2008 0x00 写在开始 之前一篇博客中写了在离线环境中使用.NET Core,之后一边学习一边写了一些页面作为测试,现在打算发布 ...

  4. html5标签canvas函数drawImage使用方法

    html5中标签canvas,函数drawImage(): 使用drawImage()方法绘制图像.绘图环境提供了该方法的三个不同版本.参数传递三种形式: drawImage(image,x,y):在 ...

  5. ASP.NET MVC开发日常一:SessionID合理清除

    在MVC Web开发中临时存储数据一般会用到Session,Cookie,ViewBag,ViewData,TempData.每个的使用场景是不同,具体区别有空再补上. Session数据最敏感,最需 ...

  6. Div Vertical Menu ver5

    这个小功能,如果是算此次,已经是第5次修改了.可以从这里看到前4次:V1, http://www.cnblogs.com/insus/archive/2011/10/17/2215637.html V ...

  7. Java—恶心的java.lang.NumberFormatException解决

    项目中要把十六进制字符串转化为十进制, 用到了到了Integer.parseInt(str1.trim(), 16):这个是不是后抛出java.lang.NumberFormatException异常 ...

  8. Android—应用程序开机自启

    android开机时候会发送开机广播,我们想要收到广播知道手机开机,才能启动我们的应用程序. 首先要在配置文件中添加相应权限: <uses-permission android:name=&qu ...

  9. SVN的使用

  10. mysql 大表拆分成csv导出

    最近公司有一个几千万行的大表需要按照城市的id字段拆分成不同的csv文件. 写了一个自动化的shell脚本 在/home/hdh 下面 linux-xud0:/home/hdh # lltotal 1 ...