ios开发中,遇到自定义高度不定的cell的时候,我们通常的做法是抽取一个frame类,在frame类中预算好高度,再返回。

但是苹果出来自动布局之后。。。春天来了!!来看看怎么巧用自动布局设置自定义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
}

(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类即可

简单介绍一下NSCache吧

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
}

【swift,oc】ios开发中巧用自动布局设置自定义cell的高度的更多相关文章

  1. 【Swift】ios开发中巧用 description 打印对象时,打印对象的属性

    ios开发中我们打印对象的时候,会直接输出对象地址,这样不方便我们开发.我们可以 巧用 description 打印对象时,输出对象的属性 在oc中直接重写即可.swift中需要遵守Printable ...

  2. 【Swift】IOS开发中自定义转场动画

    在IOS开发中,我们model另外一个控制器的时候,一般都使用默认的转场动画. 其实我们可以自定义一些转场动画.达到不同的转场效果. 步骤如下:(photoBrowser是目标控制器) 1.在源控制器 ...

  3. 【Swift】图文混排,ios开发中在textfield或textView中插入图片

    在ios开发中,我们一般都是在textfield或者textView中输入文字.当我们需要插入图片的时候其实也是很简单的 我们需要利用的textfield,textView的属性化文本,将图片以附件的 ...

  4. iOS开发中静态库之".framework静态库"的制作及使用篇

    iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...

  5. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  6. iOS开发中调试小技巧

    对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...

  7. 简述 Ruby 与 DSL 在 iOS 开发中的运用

    阅读本文不需要预先掌握 Ruby 与 DSL 相关的知识 何为 DSL DSL(Domain Specific Language) 翻译成中文就是:"领域特定语言".首先,从定义就 ...

  8. iOS开发中遇到的一些问题及解决方案【转载】

    iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // //  MyScrollView.m //  Creat ...

  9. 白话 Ruby 与 DSL 以及在 iOS 开发中的运用

    每日一篇优秀博文 2017年10月7日 周六 白话 Ruby 与 DSL 以及在 iOS 开发中的运用 阅读本文不需要预先掌握 Ruby 与 DSL 相关的知识 何为 DSL DSL(Domain S ...

随机推荐

  1. Go实现海量日志收集系统(二)

    一篇文章主要是关于整体架构以及用到的软件的一些介绍,这一篇文章是对各个软件的使用介绍,当然这里主要是关于架构中我们agent的实现用到的内容 关于zookeeper+kafka 我们需要先把两者启动, ...

  2. 一周总结:AutoEncoder、Inception 、模型搭建及下周计划

    一周总结:AutoEncoder.Inception .模型搭建及下周计划   1.AutoEncoder: AutoEncoder: 自动编码器就是一种尽可能复现输入信号的神经网络:自动编码器必须捕 ...

  3. Jupyter Notebook的快捷键

    Jupyter Notebook 有两种键盘输入模式. 编辑模式,允许你往单元中键入代码或文本,这时的单元框线是绿色的. 命令模式,键盘输入运行程序命令:这时的单元框线是蓝色.       命令模式 ...

  4. 【Spring源码深度解析学习系列】默认标签解析(三)

    Spring的标签包括默认标签和自定义标签两种 默认标签的解析方法: ###DefaultBeanDefinitionDocumentReader.java### private void parse ...

  5. 105&250-高级软件工程2017第3次作业

    小组成员 2017282110250 王婷婷 2017202110105 张芷祎 github地址 https://github.com/setezzy/Calculator_GUI PSP PSP2 ...

  6. 项目Alpha冲刺Day5

    一.会议照片 二.项目进展 1.今日安排 熟悉后台框架并尝试编写及继续搭建前台框架模版.完成登录相关的功能实现,添加一些用户相关的单元测试代码,以及相应的测试数据. 2.问题困难 前端不是很熟,页面框 ...

  7. 201621123050 《Java程序设计》第2周学习总结

    1.本周学习总结 java的数据类型 基本数据类型:介绍了java特有的boolean 引用数据类型 String:不变性:需要频繁修改时使用StringBuilder 包装类:自动拆.装箱 数组 一 ...

  8. iOS开发-简单的循环结构分析

    1.while循环 while (循环条件) {         循环体: } // 1.定义循环变量 ; // 2.循环条件 ) { // 3.循环体 printf("%d\n" ...

  9. python 操作Memcached

    启动Memcached memcached -d -m 10 -u root -l 10.211.55.4 -p 12000 -c 256 -P /tmp/memcached.pid 参数说明: -d ...

  10. Flask 学习 七 用户认证

    使用werkzeug 实现密码散列 from werkzeug.security import generate_password_hash,check_password_hash class Use ...