autolayout 要点
2016-01-14 17:13
309 查看
setNeedsUpdateConstraints
是当一个view的属性发生变化并可能影响到布局时,需要调用这个方法来标记一下,在后面再次进行图层的布局
needsUpdateConstraints
通过调用这个方法返回的BOOL来确定是否需要重新布局,如果是YES的话,那么就重新布局。
updateConstraintsIfNeeded
立即出发约束更新,自动更新布局。
updateConstraints
自定义view应该重写此方法在其中建立constraints(约束),注意:要在实现的最后调用[super
updateConstraints]方法
在autolayout中,如果设置了label为多行,
CGFloat preferredMaxWidth = [UIScreen mainScreen].bounds.size.width - padding * 3 - 45;
_contentLabel.numberOfLines = 0;
_contentLabel.preferredMaxLayoutWidth = preferredMaxWidth; //多行时必须设置
如果UILabel的宽度是自适应的,不确定,那么可以使用如下的代码设置
iOS 8 WWDC中推出了self-sizing cell的概念,旨在让cell自己负责自己的高度计算,使用frame layout和auto layout都可以享受到:
这个特性首先要求是iOS 8,要是最低支持的系统版本小于8的话,还得针对老版本单写套老式的算高(囧),不过用的API到不是新面孔:
这里又不得不吐槽了,自动计算rowHeight跟estimaTEDRowHeight到底是有什么仇,如果不加上估算高度的设置,自动算高就失效了。
PS:iOS 8系统中rowHeight的默认值已经设置成了UITableViewAutomaticDimension,所以第二行代码可以省略。
动态计算cell的高度:
看了代码,可能你有点疑问,为何这儿要加1呢?笔者告诉你,如果不加1,结果就是错误的,Cell中UILabel将显示不正确。原因就是因为这行代码CGSize
size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];由于是在cell.contentView上调用这个方法,那么返回的值将是contentView的高度,UITableViewCell的高度要比它的contentView要高1,也就是它的分隔线的高度
Ps:
和每个UITableViewCell ReuseID一一对应的template layout cell
这个cell只为了参加高度计算,不会真的显示到屏幕上;它通过UITableView的-dequeueCellForReuseIdentifier:
方法lazy创建并保存,所以要求这个ReuseID必须已经被注册到了UITableView中,也就是说,要么是Storyboard中的原型cell,要么就是使用了UITableView的-registerClass:forCellReuseIdentifier:或-registerNib:forCellReuseIdentifier:其中之一的注册方法。
根据autolayout约束自动计算高度
使用了系统在iOS 6就提供的API:-systemLayoutSizeFittingSize:
根据index path的一套高度缓存机制
计算出的高度会自动进行缓存,所以滑动时每个cell真正的高度计算只会发生一次,后面的高度询问都会命中缓存,减少了非常可观的多余计算。
转自:http://www.cocoachina.com/industry/20140604/8668.html
http://www.wuseyun.com/htmldata/news/0/86649.html
是当一个view的属性发生变化并可能影响到布局时,需要调用这个方法来标记一下,在后面再次进行图层的布局
needsUpdateConstraints
通过调用这个方法返回的BOOL来确定是否需要重新布局,如果是YES的话,那么就重新布局。
updateConstraintsIfNeeded
立即出发约束更新,自动更新布局。
updateConstraints
自定义view应该重写此方法在其中建立constraints(约束),注意:要在实现的最后调用[super
updateConstraints]方法
在autolayout中,如果设置了label为多行,
CGFloat preferredMaxWidth = [UIScreen mainScreen].bounds.size.width - padding * 3 - 45;
_contentLabel.numberOfLines = 0;
_contentLabel.preferredMaxLayoutWidth = preferredMaxWidth; //多行时必须设置
如果UILabel的宽度是自适应的,不确定,那么可以使用如下的代码设置
- (void)layoutSubViews { [super layoutSubViews]; self.label.preferredMaxLayoutWidth = self.label.bounds.size.width; }
iOS 8 WWDC中推出了self-sizing cell的概念,旨在让cell自己负责自己的高度计算,使用frame layout和auto layout都可以享受到:
这个特性首先要求是iOS 8,要是最低支持的系统版本小于8的话,还得针对老版本单写套老式的算高(囧),不过用的API到不是新面孔:
self.tableView.estimaTEDRowHeight=213; self.tableView.rowHeight=UITableViewAutomaticDimension;
这里又不得不吐槽了,自动计算rowHeight跟estimaTEDRowHeight到底是有什么仇,如果不加上估算高度的设置,自动算高就失效了。
PS:iOS 8系统中rowHeight的默认值已经设置成了UITableViewAutomaticDimension,所以第二行代码可以省略。
动态计算cell的高度:
看了代码,可能你有点疑问,为何这儿要加1呢?笔者告诉你,如果不加1,结果就是错误的,Cell中UILabel将显示不正确。原因就是因为这行代码CGSize
size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];由于是在cell.contentView上调用这个方法,那么返回的值将是contentView的高度,UITableViewCell的高度要比它的contentView要高1,也就是它的分隔线的高度
Ps:
和每个UITableViewCell ReuseID一一对应的template layout cell
这个cell只为了参加高度计算,不会真的显示到屏幕上;它通过UITableView的-dequeueCellForReuseIdentifier:
方法lazy创建并保存,所以要求这个ReuseID必须已经被注册到了UITableView中,也就是说,要么是Storyboard中的原型cell,要么就是使用了UITableView的-registerClass:forCellReuseIdentifier:或-registerNib:forCellReuseIdentifier:其中之一的注册方法。
根据autolayout约束自动计算高度
使用了系统在iOS 6就提供的API:-systemLayoutSizeFittingSize:
根据index path的一套高度缓存机制
计算出的高度会自动进行缓存,所以滑动时每个cell真正的高度计算只会发生一次,后面的高度询问都会命中缓存,减少了非常可观的多余计算。
转自:http://www.cocoachina.com/industry/20140604/8668.html
http://www.wuseyun.com/htmldata/news/0/86649.html
相关文章推荐
- 自适应网页设计(Responsive Web Design)
- PHP中fopen,file_get_contents,curl函数的区别
- sql开启xp_cmdshell
- 有关rsync的一些语句
- 分享一个比较好用的流式布局的label控件
- C++调用java的过程
- java 添加水印文字和图片
- lua 绑定c++
- 经济基础知识三
- 秒杀场景下MySQL的低效
- redis 模糊删除命令
- Fragment+viewpager切换滑动页面Demo
- 自学QT之UDP发送数据
- linux用户相关操作
- Facebook Patch for Dalvik
- Cannot use the diamond generic notation when running in JDK inferior to 1.7 mode
- C#:VS中遇到的奇怪问题
- 运维人,你应该了解的三张武功心法图
- poi报表技术快速入门demo(带图片插入)
- 在Linux服务器建立小团队Git服务