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. CSS3美化网页元素

    <span>标签 </span>属性名 含义 举例font-family 设置字体类型 font-family:"隶书"font-size 设置字体大小 f ...

  2. 『备注』&#x; 格式 的编码转换

    在很多 网站(或者很多 WebService), 我们总能看到 Ӓ &#A22A;  这种格式 的编码. 如何将这种编码 转换成 实际文本,C#代码如下: //各种 幺蛾子网页图标 请参见: ...

  3. 2017-2018-1 20155205 实现mypwd

    2017-2018-1 20155205 实现mypwd 课堂总结 根据上课对ls -l功能的实现,我总结了实现一个linux命令需要的步骤: 使用man -k xx | grep xx查看帮助文档, ...

  4. 07-TypeScript的For循环

    在传统的JavaScript中,关于循环,可以有两种方式,一种是forEach,一种是for. forEach的用法如下: var sarr=[1,2,3,4]; sarr.desc="he ...

  5. N阶台阶问题(详解)

    原创 问题描述: 有N阶台阶,每一步可以走1步台阶或者2步台阶,求出走到第N阶台阶的方法数. 解题思路: 类似于建立树的过程 1 2 1 2   1 2  1        2      1    2 ...

  6. LR之error(一)

    1 录制时频繁卡死的解决方案 添加数据保护 路径:计算机--高级系统设置(环境变量设置的上级窗口)--高级--设置--数据执行保护 更改LR录制设置,将run-time setting的brower改 ...

  7. [Oracle]undo表空间使用量为100%

    在Toad中发现undo表空间undotbs1使用量已经达到100%,但是奇怪的是数据库并没有hang住,依然可以正常运转 通过Oracle提供的EM查看undotbs1表空间的使用,也达到了78.8 ...

  8. 用Vue.js开发微信小程序:开源框架mpvue解析

    前言 mpvue 是一款使用 Vue.js 开发微信小程序的前端框架.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小程序提供了代码复用的能力.如果想将 H5 项目改造为小程 ...

  9. WPF 自定义滚动条(ScrollView、ScrollBar)样式

    一.滚动条基本样式 本次修改Scrollview及ScrollBar滚动条样式是通过纯样式实现的.修改的内容包含滚动条的颜色,上下按钮的隐藏.另外添加了鼠标经过滚动条动画. style样式如下: &l ...

  10. SpringBoot的RestController vs @ResponseBody + @Controller

    @Controller和@RestController的区别?官方文档:@RestController is a stereotype annotation that combines @Respon ...