理解iOS 8中的Self Sizing Cells和Dynamic Type
http://www.cocoachina.com/ios/20140922/9717.html

在iOS 8中,苹果引入了UITableView的一项新功能--Self Sizing Cells,对于不少开发者来说这是新SDK中一项非常有用的新功能。在iOS 8之前,如果想在表视图中展示可变高度的动态内容时,你需要手动计算行高,而Self Sizing Cells为展示动态内容提供了一个解决方案。以下是你使用Self Sizing Cells时需要注意的事项:
1.为原型单元格定义Auto Layout约束
2.指定表视图的estimatedRowHeight
3.将表视图的rowHeight属性设置为UITableViewAutomaticDimension
如果用代码表示最后两点,那就是
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
仅有两行代码,你通知表视图计算单元格的尺寸以匹配内容和和动态进行渲染。Self Sizing Cells功能可以为你节省大量写代码的时间,你喜欢爱上它!
使用Self Sizing Cells构建简单的Demo
学习新知识的最好办法莫过于使用它,我们将要开发一个简单的Demo来阐释Self Sizing Cell。我们从工程模板开始,一个简单的以表为主的应用展示了旅店列表。原型单元格包含两个单行的文本标签,一个是名称,一个是地址。下载并运行示例工程,你会看到以下界面:

有图所知,由于行高是固定的,所以一些旅店的地址被缩短了。在开发者包含大量表视图的应用时,你可能会经常遇见此类问题。过去,你可能需要通过缩小文本大小或者增加行数来解决该问题。不过从iOS 8以后,你所需要的是使用Self Sizing Cells来正确展示单元格内容,无论内容有多长。
添加Auto Layout约束
你可能会厌恶并尽量避免使用Auto Layout。不过没有Auto Layout,Self Sizing Cells功能也是无法工作的,它依赖约束来确定合适的行高。事实上,表视图会调用systemLayoutSizeFittingSize并返回基于布局约束的单元格尺寸。
如果你是头一次使用Auto Layout,推荐你先看下Auto Layout Introduction。
本文所用的项目模板并没有使用Auto Layout约束,所以我们要首先添加一个。对于旅店名称标签,点击自动布局菜单的"Pin"按钮,并添加4个间距约束。

为地址标签添加左、右以及下方三个约束。

正确配置好约束后,界面如下:

设置预估行高
配置完自动布局后,接下来要在ViewController的viewDidLoad方法中添加如下代码:
tableView.estimatedRowHeight = 68.0
tableView.rowHeight = UITableViewAutomaticDimension
第一行代码设置了单元格的预估行高,就是现有的原型单元格的高度。第二行代码是改变UITableViewAutomaticDimension的rowHeight属性,这是iOS 8中默认的行高。换句话说,你通知表视图基于其他信息来算出单元格的尺寸大小。
如果你测试应用,那么会发现单元格此时是不可调整的,原因是旅店的名称和地址标签被设定在一行代码中,所以将代码行数设定为零,并允许标签自动增长。

再次编译并运行app,表视图单元格会根据内容调整。

A Bug?!
我不确定这是不是一个bug,但是UseYourLoaf也注意到了这个问题(博文:Self Sizing Table View Cellshttp://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html)。当首次展示表视图时,你会发现一些单元格不能正确调整大小。但是当你滚动表视图时,新单元格的行高是正确的。你可以在视图展示后强制重载以解决这个问题。
override func viewDidAppear(animated: Bool) {
tableView.reloadData()
}
Dynamic Type
Self Sizing Cell对于支持Dynamic Type非常有用。你可能没听说过Dynamic Type,但你可能见过系统的“Settings”屏幕:

Dynamic Type最初由iOS 7引入,允许用户自定义文本大小从而满足app的需要。不过仅有采用Dynamic Type的app才能响应文本的改变,可能只有一小部分第三方应用使用了该功能。
从iOS 8开始,苹果想要鼓励开发者使用Dynamic Type。正如在WWDC session中提到的那样,所有苹果系统级应用都使用了Dynamic Type,并且内置的标签已经有了动态字体。当用户改变文本大小时,这些标签也会改变其大小。
更进一步说,Self Sizing Cell的引入是促进Dynamic Type使用的办法,它可以节省大量写代码调整行高的时间。如果单元格可以自动调整了,那么使用Dynamic Type就很显而易见了。
你只需要从尺寸固定的自定义字体中将字体更改为文本类型(比如标题和内容主体)首选的字体。也就是说当你运行app时,它会适应文本大小的改变。
总结
你已经通过本文了解了基本的Self Sizing Cells和Dynamic Type。我们鼓励你使用新功能,并更新app以支持Dynamic Type。Self Sizing Cell是我最喜欢的iOS 8功能之一,仅需两行代码,你就可以适应单元格中的动态内容。此外,你可以在此下载完整的项目,不过请注意我使用的是Xcode 6 Beta 7来创建项目。
理解iOS 8中的Self Sizing Cells和Dynamic Type的更多相关文章
- 深入理解 iOS 开发中的锁
来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大 ...
- 理解ios 11中webview的视口
iOS 11在状态栏区域带来了一些新的,也许是不直观的行为,这对使用Apache Cordova或Ionic等工具的开发人员尤为重要.特别是,这种行为变化会影响任何基于Web的应用程序,这些应用程序在 ...
- 全面理解iOS开发中的Scroll View[转]
from:http://mobile.51cto.com/hot-430409.htm 可能你很难相信,UIScrollView和一个标准的UIView差异并不大,scroll view确实会多一些方 ...
- 深入理解iOS开发中的BitCode功能
前言 做iOS开发的朋友们都知道,目前最新的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都被这个突如其来的bitcode功能给坑过导致项目编译失败,而这些因为bitcode而 ...
- iOS开发中GCD在多线程方面的理解
GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中 ...
- 0112.1——iOS开发之理解iOS中的MVC设计模式
模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程 ...
- iOS开发之理解iOS中的MVC设计模式
模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程 ...
- [转载]对iOS开发中内存管理的一点总结与理解
对iOS开发中内存管理的一点总结与理解 做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作 ...
- IOS Table中Cell的重用reuse机制分析
IOS Table中Cell的重用reuse机制分析 技术交流新QQ群:414971585 创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITab ...
随机推荐
- HDU 1507 Uncle Tom's Inherited Land*
题目大意:给你一个矩形,然后输入矩形里面池塘的坐标(不能放东西的地方),问可以放的地方中,最多可以放多少块1*2的长方形方块,并输出那些方块的位置. 题解:我们将所有未被覆盖的分为两种,即分为黑白格( ...
- VS2010/MFC:模态对话框及其弹出过程
模态对话框及其弹出过程 加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨益.趁热打铁,这一节讲讲什么是模态对话框和非模态对话框,以及模态对话框怎 ...
- POJ 2762 Going from u to v or from v to u? (Tarjan) - from lanshui_Yang
Description In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has ...
- 记载abp中Dbcontext的疑问
q:abp中httpcontext如何在一次请求中保证获取的是相同的实例. 大牛的原话: LifestylePerWebRequest does not works good with async. ...
- E - Catch That Cow
Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...
- HDU 1222(数论,最大公约数)
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Descr ...
- mysql innodb存储引擎的聚集索引
InnoDB聚集索引 MySQL有没有支持聚集索引,取决于采用哪种存储引擎. MySQL InnoDB一定会建立聚集索引,所谓聚集,指实际数据行和相关的键值保存在一块,这也决定了一个表只能有一个聚集索 ...
- ThinkPHP第八天(U函数放置在外部JS不会被解析,错误界面定制,错误信息变量)
1.JS外部文件中U函数不会被解析,内部JS代码可以被解析. 2.halt. _404可以定制错误模板,在配置文件中配置 TMPL_EXCEPTION_FILE =>'./Public/Tpl/ ...
- Cobbler自动化部署
一:PXE.Kickstart与Cobbler的概念: PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的技术,需要网卡的硬件支持,工作于C/S的 ...
- 转:sublime text快捷键 (很实用的东东)
一个好的编辑器,能大大提高编程的效率.如果能熟知软件的快捷键,那更能让你得心印手.这些内容都是我网上和自己实际使用过程中所收集而来的,在网络上应该也算比较全面的了吧.欢迎大家补充,我也会在以后慢慢添加 ...