【swift,oc】ios开发中巧用自动布局设置自定义cell的高度
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的高度的更多相关文章
- 【Swift】ios开发中巧用 description 打印对象时,打印对象的属性
ios开发中我们打印对象的时候,会直接输出对象地址,这样不方便我们开发.我们可以 巧用 description 打印对象时,输出对象的属性 在oc中直接重写即可.swift中需要遵守Printable ...
- 【Swift】IOS开发中自定义转场动画
在IOS开发中,我们model另外一个控制器的时候,一般都使用默认的转场动画. 其实我们可以自定义一些转场动画.达到不同的转场效果. 步骤如下:(photoBrowser是目标控制器) 1.在源控制器 ...
- 【Swift】图文混排,ios开发中在textfield或textView中插入图片
在ios开发中,我们一般都是在textfield或者textView中输入文字.当我们需要插入图片的时候其实也是很简单的 我们需要利用的textfield,textView的属性化文本,将图片以附件的 ...
- iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
- iOS开发中静态库制作 之.a静态库制作及使用篇
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
- iOS开发中调试小技巧
对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...
- 简述 Ruby 与 DSL 在 iOS 开发中的运用
阅读本文不需要预先掌握 Ruby 与 DSL 相关的知识 何为 DSL DSL(Domain Specific Language) 翻译成中文就是:"领域特定语言".首先,从定义就 ...
- iOS开发中遇到的一些问题及解决方案【转载】
iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // // MyScrollView.m // Creat ...
- 白话 Ruby 与 DSL 以及在 iOS 开发中的运用
每日一篇优秀博文 2017年10月7日 周六 白话 Ruby 与 DSL 以及在 iOS 开发中的运用 阅读本文不需要预先掌握 Ruby 与 DSL 相关的知识 何为 DSL DSL(Domain S ...
随机推荐
- php正则相关知识点
关于正则,其实简单就是搜索和匹配.php,java,python等都是支持正则的,php正则兼容perl.好多同学觉得正则比较难,比较抽象,其实正则是非常简单的,主要是一个熟悉和反复练习的结果,还有一 ...
- 线程池与Python中的GIL
线程池是一个操作系统的概念,它是对多线程的一种优化. 多线程的时候,创建和销毁线程伴随着操作系统的开销,如果频繁创建/销毁线程,则会使效率大大降低. 而线程池,是先创建出一批线程放入池子里,需要创建线 ...
- Spring MVC之适配器的获取及执行(RequestMappingHandlerAdapter)
首先看下doDispatch()方法如何找到适合的适配器来执行方法的: protected HandlerAdapter getHandlerAdapter(Object handler) throw ...
- Beta冲刺-用户测试报告
一.项目概述 1.1项目名称 高校学生征信系统 1.2项目简介 此项目基于SSH框架,力图为学生提供征信服务和信用相关的借款和申请活动.其中以信用统计和管理为主,信用使用为辅,构建出一个集信用收集和使 ...
- python的PEP8 代码风格指南
PEP8 代码风格指南 这篇文章原文实际上来自于这里:https://www.python.org/dev/peps/pep-0008/ 知识点 代码排版 字符串引号 表达式和语句中的空格 注释 版本 ...
- Sudoku 第一步
看到这个问题的思路是先解决生成数独生成器的编写,然后再解决数独求解的问题.最开始第一想法就是暴力求解,仔细算一下复杂度,发现这肯定耗时很久,于是看了很多博客(见转载).我们用回溯搜出来正解.
- python 类的绑定方法和非绑定方法
一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. class People: def __ ...
- Python-进程与线程理论基础-Day10
进程与线程理论基础 1.背景知识 理论基础: 一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理.调度进程,并且将多个进程对硬件的竞争变得有序 二 多道技术: 1.产生背景 ...
- Docker Mysql主从同步配置搭建
Docker Mysql主从同步配置搭建 建立目录 在虚拟机中建立目录,例如路径/home/mysql/master/data,目录结构如下: Linux中 新建文件夹命令:mkdir 文件夹名 返回 ...
- Docker学习笔记 - Docker的容器
docker logs [-f] [-t] [--tail] 容器名 -f -t --tail="all" 无参数:返回所有日志 -f 一直跟踪变化并返回 -t 带时间戳返 ...