Masonry scrollview循环布局
前言
说到iOS自动布局,有很多的解决办法。有的人使用xib/storyboard自动布局,也有人使用frame来适配。对于前者,笔者并不喜欢,也不支持。对于后者,更是麻烦,到处计算高度、宽度等,千万大量代码的冗余,对维护和开发的效率都很低。
笔者在这里介绍纯代码自动布局的第三方库:Masonry。这个库使用率相当高,在全世界都有大量的开发者在使用,其star数量也是相当高的。
效果图
本节详解Masonry的循环创建视图的基本用法,先看看效果图:

核心代码
看下代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | @interface ScrollViewController () @property (nonatomic, strong) UIScrollView *scrollView; @end @implementation ScrollViewController - (void)viewDidLoad {   [super viewDidLoad];   self.scrollView = [[UIScrollView alloc] init];   self.scrollView.pagingEnabled = NO;   [self.view addSubview:self.scrollView];   self.scrollView.backgroundColor = [UIColor lightGrayColor];   CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;   UILabel *lastLabel = nil;   for (NSUInteger i = 0; i < 20; ++i) {     UILabel *label = [[UILabel alloc] init];     label.numberOfLines = 0;     label.layer.borderColor = [UIColor greenColor].CGColor;     label.layer.borderWidth = 2.0;     label.text = [self randomText];     // We must preferredMaxLayoutWidth property for adapting to iOS6.0     label.preferredMaxLayoutWidth = screenWidth - 30;     label.textAlignment = NSTextAlignmentLeft;     label.textColor = [self randomColor];     [self.scrollView addSubview:label];     [label mas_makeConstraints:^(MASConstraintMaker *make) {       make.left.mas_equalTo(15);       make.right.mas_equalTo(self.view).offset(-15);       if (lastLabel) {         make.top.mas_equalTo(lastLabel.mas_bottom).offset(20);       } else {         make.top.mas_equalTo(self.scrollView).offset(20);       }     }];     lastLabel = label;   }   [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {     make.edges.mas_equalTo(self.view);     // 让scrollview的contentSize随着内容的增多而变化     make.bottom.mas_equalTo(lastLabel.mas_bottom).offset(20);   }]; } - (UIColor *)randomColor {   CGFloat hue = ( arc4random() % 256 / 256.0 );  //  0.0 to 1.0   CGFloat saturation = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from white   CGFloat brightness = ( arc4random() % 128 / 256.0 ) + 0.5;  //  0.5 to 1.0, away from black   return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1]; } - (NSString *)randomText {   CGFloat length = arc4random() % 50 + 5;   NSMutableString *str = [[NSMutableString alloc] init];   for (NSUInteger i = 0; i < length; ++i) {     [str appendString:@"测试数据很长,"];   }   return str; } @end | 
讲解
对于循环创建,我们需要记录下一个视图所依赖的控件,这里使用了lastLabel来记录。
我们要想让scrollview的contentSize随内容的变化而变化,那么就我们一定要添加注意添加约束:
| 1 2 3 4 5 6 7 8 |   [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {     make.edges.mas_equalTo(self.view);     // 让scrollview的contentSize随着内容的增多而变化     make.bottom.mas_equalTo(lastLabel.mas_bottom).offset(20);   }]; | 
对于scrollview和tableview,我们不能使用bottom来计算其高,因为这个属性对于scrollview和tableview来说,不用用来计算高度的,而是用于计算contentSize.height的。我们要想随内容而变化,以便可滚动查看,就必须设置bottom约束。
Masonry scrollview循环布局的更多相关文章
- 使用Masonry搭建特殊布局时与xib的对比
		之前只有比较浅的接触过Masonry.项目中大多数的布局还是用xib中的AutoLayout与手码的frame计算相结合,相信也会有很多项目和我一样是这两种布局的组合.其实xib各方面用的感觉都挺好, ... 
- NGUI ScrollView 循环 Item 实现性能优化
		今天来说说一直都让我在项目中头疼的其中一个问题,NGUI 的scrollView 列表性能问题,实现循环使用item减少性能上的开销. 希望能够给其他同学们使用和提供一个我个人的思路,这个写的不是太完 ... 
- 封装scrollView 循环滚动,tableViewCell(连载) mvc
		封装 封装 封装 ... 封装的重要性太重要了 给大家在送点干货 从一个项目中抽取出来的.和大家一起分享 封装scrollView 循环滚动.tableViewCell(连载) 明天还会更新 tabl ... 
- iOS scrollview循环播放加缩放
		前些日子一直在研究3d的框架没有时间写博客,不过最后需求改了,也没研究出个啥.这段时间出了新的需求,需要循环播放图片,并且滑动的时候中间的图片有缩放的效果.刚开始想在网上搜索,不过并没有找到合适的de ... 
- 97、进入ScrollView根布局页面,直接跳到页面底部,不能显示顶部内容
		API使用:http://www.cnblogs.com/over140/archive/2011/01/27/1945964.html 以ScrollView为根的部局,不能从顶部显示其包含的页面内 ... 
- Scrollview包裹布局问题。
		输入框获取焦点,键盘弹出,背景图片上移: https://blog.csdn.net/wljian1/article/details/79962802 android:scrollbarThumbVe ... 
- ScrollView在布局中的作用
		ScrollView就是滚动一个View,将View里面的内容滚动起来. 但是由于scroolview只能有一个孩子,因此我们可以在ScrollView中在定义一个布局. 这样的话,我们就会直接滚动整 ... 
- scrollview 滚动布局
		<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layou ... 
- iOS masonry 不规则tagView布局 并自适应高度
		在搜索页面经常会有不规则的tag出现,这种tagView要有点击事件,单个tagView可以设置文字颜色,宽度不固定根据内容自适应,高度固定,数量不固定.总高度就不固定.最近对于masonry的使用又 ... 
随机推荐
- Python+selenium鼠标、键盘事件
			鼠标操作 现在的Web产品提供了丰富的鼠标交互方式,例如鼠标右击.双击.悬停.甚至是鼠标拖动等功能,在Webdriver中,将这些关于鼠标操作的方法封装在ActionChains类提供. 1.鼠标右击 ... 
- Oracle中有关数学表达式的语法
			Oracle中有关数学表达式的语法 三角函数 SIN ASIN SINHCOS ACOS COSHTA ... 
- hihoCoder#1105 题外话·堆
			原题地址 有没有更优雅地堆模板啊,总感觉我写的有些啰嗦 代码: #include <iostream> using namespace std; #define MAX_NODE 1000 ... 
- 间谍网络(tarjan缩点)
			洛谷传送门 看着这道题给人感觉就是tarjan求SCC,然而还得判断是否能控制全部间谍,这就得先从可以贿赂的点dfs一遍. 如果没有全部被标记了,就输出NO,再从没被标记的点里找最小的标号. 如果全被 ... 
- bzoj 3786  星系探索 dfs+splay
			[BZOJ3786]星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球 ... 
- java中filter的用法
			filter过滤器主要使用于前台向后台传递数据是的过滤操作.程度很简单就不说明了,直接给几个已经写好的代码: 一.使浏览器不缓存页面的过滤器 Java代码 import javax.servlet ... 
- Lucene的例子
			lucene爬数据库中的数据无非也是查询数据.所有我们用lucene搜索数据主要有下面几个步骤:(代码紧供参考) 一 , 从数据库中查数据 ====爬数据 ------------- ... 
- LCA 在线倍增法 求最近公共祖先
			第一步:建树 这个就不说了 第二部:分为两步 分别是深度预处理和祖先DP预处理 DP预处理: int i,j; ;(<<j)<n;j++) ;i<n;++i) ) fa[i ... 
- c++ 高性能日志库(muduo_AsyncLogging)
			c++ 高性能日志库(muduo_AsyncLogging) 实现一个高效的网络日志库要解决那些问题? 首先明确一下问题的模型,这是一个典型的多生产者 单消费者问题,对于前端的日志库使用者来说,应该做 ... 
- 洛谷——P1951 收费站_NOI导刊2009提高(2)
			https://www.luogu.org/problem/show?pid=1951 题目描述 在某个遥远的国家里,有n个城市.编号为1,2,3,…,n. 这个国家的政府修建了m条双向的公路.每条公 ... 
