理解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 ...
随机推荐
- web 性能优化指南阅读笔记
1.关于拥塞预防算法 PRR-比例降速,RFC6937 规定的一个新算法,其目标是改进丢包后的恢复速度,谷歌测量结果:该算法改进丢包造成的平均连接延迟减少了3%-10%.PRR是linux 3.2+内 ...
- 1TB到底能存放多少东西?
网盘大战逐渐升级,360和百度网盘先后推出的1TB网盘存储,而腾讯甚至为其微云网盘打出10TB的招牌来哄抢用户. 这里我们聊聊1TB的网盘究竟能放多少东西? 以下是我在网上找到的一些资料. 一)30年 ...
- QWidget QMainWindow QDialog 之间的区别
QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个原子:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己的表现.每一个窗口部件都是矩形,并且它们按Z轴顺序排列的.一个窗口部 ...
- Delphi中三种方法获取Windows任务栏的高度
第一种:需要引用Windows单元 ShowMessage(IntToStr(GetSystemMetrics(SM_CYSCREEN)-GetSystemMetrics(SM_CYFULLSCREE ...
- spring与redis集成之aop整合方案
java使用redis缓存可以使用jedis框架,jedis操作简单,没有什么复杂的东西需要学习,网上资料很多,随便看看就会了. 将spring与redis缓存集成,其实也是使用jedis框架,只不过 ...
- Windows Azure HDInsight 现已正式发布!
今天,我们宣布正式发布 Windows Azure HDInsight 服务.HDInsight 是 Microsoft 提供的基于 Hadoop 的服务,为云提供 100% 的 Apache Had ...
- HDU 1147 Pick-up sticks
题解:每放一根棍子,都判断一下它与它前面的且在顶端的棍子是否相交,相交的话则将相应的棍子从解空间中除去. #include <cstdio> const double eps=1e-14; ...
- HDU 2501 Tiling_easy version
递推式:f[n]=2*f[n-2]+f[n-1] #include <cstdio> #include <iostream> using namespace std; ]; i ...
- vector数据查找方法
用STL编敲代码时常常使用vector容器来存储数据.当容器中的数据有序时我们能够採取两种方式: (1) 利用<algorithm>中的find函数进行查找: (2) 折半查找. 另外也能 ...
- echarts 应用数个样例
应用一:环形图和饼图嵌套 先说明一下内部文件分布: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGV4dGJveQ==/font/5a6L5L2T/fo ...