您的位置:首页 > 其它

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的宽度是自适应的,不确定,那么可以使用如下的代码设置

- (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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: