【swift,oc】ios开发中巧用自动布局设置自定义cell的高度
2015-05-18 19:40
741 查看
ios开发中,遇到自定义高度不定的cell的时候,我们通常的做法是抽取一个frame类,在frame类中预算好高度,再返回。
但是苹果出来自动布局之后。。。春天来了!!来看看怎么巧用自动布局设置自定义cell的高度(以下代码都用swift实现,oc也是一样的,只是语法不一样)
(1)自定义一个cell视图,可以用xib,也可以用storyboard中得动态cell,拖好控件,利用自动布局设置好约束
(2)在cell类中新建一个对象方法(swift中的函数),传入数据模型,返回一个CGFloat,必须按照下面实现哦
(2.1)当tableview中好几个自定义cell 的时候,我们就要在cell类中定义一个类方法(类函数),来判断用哪个cell(只用一种cell的忽略此步骤)
(3)牛逼的方法来了。UITableViewDelegate中,有一个代理方法(函数)
这个函数,是预估cell的高度,实现这个函数之后,会提高程序的效率哦。不信可以自己测试一下哈。。。我们可以随便返回一个数值
(4)关键的步骤来啦!。 UITableViewDelegate 的返回cell高度的方法(函数)
以上四步之后,已经可以实现根据数据自动调整,其实就是在显示之前偷偷把页面预布局一下而已。。。但是作为一个装逼的程序员。。还可以继续优化一下哈
。以为回滚的时候,已经还的重复计算行高,要优化一下哈。。。用苹果自带的NSCache类即可
[b]简单介绍一下[b]NSCache吧[/b][/b]
1. 线程安全
2. 使用根 NSMutableDictionary 非常类似
3. 当内存不足的时候,系统会自动清理 NSCache
4. 使用 NSCache 有一个注意事项:一旦缓存的对象被清理,需要能够重新计算,NSCache 中的对象是不稳定的
-------------开始撸代码-------------
先实例化一个NSCache对象
然后取行高的时候如下,只是比上面多两步而已。。。
但是苹果出来自动布局之后。。。春天来了!!来看看怎么巧用自动布局设置自定义cell的高度(以下代码都用swift实现,oc也是一样的,只是语法不一样)
(1)自定义一个cell视图,可以用xib,也可以用storyboard中得动态cell,拖好控件,利用自动布局设置好约束
(2)在cell类中新建一个对象方法(swift中的函数),传入数据模型,返回一个CGFloat,必须按照下面实现哦
///返回cell的高度 func heightForCell(status:HJCStatus)->(CGFloat){ //设置数据 self.status = status //刷新布局 self.layoutIfNeeded() //返回最最下方控件的最大Y值,就是高度啦 return CGRectGetMaxY(bottomView.frame) }
(2.1)当tableview中好几个自定义cell 的时候,我们就要在cell类中定义一个类方法(类函数),来判断用哪个cell(只用一种cell的忽略此步骤)
///返回cell的identifier class func identifierOfcell(status:HJCStatus)->(String){ if 条件一 { return "homeCell" } return "retweetedCell" }
(3)牛逼的方法来了。UITableViewDelegate中,有一个代理方法(函数)
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
这个函数,是预估cell的高度,实现这个函数之后,会提高程序的效率哦。不信可以自己测试一下哈。。。我们可以随便返回一个数值
//预估行高 override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return 200 }
(4)关键的步骤来啦!。 UITableViewDelegate 的返回cell高度的方法(函数)
//准确行高 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { //取得数据 let status = statuses![indexPath.row]//获得identifier let id = HJCHomeCell.identifierOfcell(status) //取出合适的cell let cell = tableView.dequeueReusableCellWithIdentifier(id) as! HJCHomeCell //计算出行高 let rowHeigth = cell.heightForCell(status)return rowHeigth }
以上四步之后,已经可以实现根据数据自动调整,其实就是在显示之前偷偷把页面预布局一下而已。。。但是作为一个装逼的程序员。。还可以继续优化一下哈
。以为回滚的时候,已经还的重复计算行高,要优化一下哈。。。用苹果自带的NSCache类即可
[b]简单介绍一下[b]NSCache吧[/b][/b]
1. 线程安全
2. 使用根 NSMutableDictionary 非常类似
3. 当内存不足的时候,系统会自动清理 NSCache
4. 使用 NSCache 有一个注意事项:一旦缓存的对象被清理,需要能够重新计算,NSCache 中的对象是不稳定的
-------------开始撸代码-------------
先实例化一个NSCache对象
var rowHeightCache = NSCache()
然后取行高的时候如下,只是比上面多两步而已。。。
//准确行高 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { //取得数据 let status = statuses![indexPath.row] //先从行高缓存中取 if let rowHeight = rowHeightCache.objectForKey(status.id) as? CGFloat{ return rowHeight } //获得identifier let id = HJCHomeCell.identifierOfcell(status) //取出合适的cell let cell = tableView.dequeueReusableCellWithIdentifier(id) as! HJCHomeCell //计算出行高 let rowHeigth = cell.heightForCell(status) //缓存起来,下次直接取 rowHeightCache.setObject(rowHeigth, forKey: status.id) return rowHeigth }
相关文章推荐
- iOS开发——UI进阶篇(三)自定义不等高cell,如何拿到cell的行高,自动计算cell高度,(有配图,无配图)微博案例
- IOS 开发中 TableView的文本Cell高度的自适应,UILabel自动换行适应
- ios开发——自定义的表情键盘(组件封装与自动布局)
- iOS开发中自定义tableView中某个cell的高度
- iOS开发之自定义表情键盘(组件封装与自动布局)
- iOS 开发,屏幕旋转、旋转屏幕collectionView cell 的自动布局问题
- iOS - UICollectionView 自定义布局之风火轮[译] (原版为swift,我这里的实现改为OC)
- 【iOS开发-64】微博案例练习:用代码自定义cell,主要内容是针对不同高度的cell
- iOS开发之自定义表情键盘(组件封装与自动布局)
- IOS Swift3.0 TableViewCell自定义高度
- iOS开发(OC)——文字的自适应高度和行间距的设置
- iOS开发之自定义表情键盘(组件封装与自动布局)
- Ios开发Swift自定义UIbutton增加一个能设置高亮状态下背景颜色的方法
- iOS自动布局实现Cell和Tableview高度自适应(SDAutoLayout)
- iOS开发小技巧--iOS8之后的cell自动计算高度
- 自动布局小知识--UITableViewCell自定义高度,Label长度自适应
- [菜鸟成长记]iOS开发自学笔记04-AutoLayout自动布局
- iOS中Cell高度如何能够自动适应需要显示的内容
- iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档
- iOS开发笔记--OC工程中调用不了Swift代码