理解iOS 8中的Self Sizing Cells和Dynamic Type

来源:互联网 发布:吴敦义 知乎 编辑:程序博客网 时间:2024/06/09 18:47

转载自:http://www.cocoachina.com/ios/20140922/9717.html


self-sizing-cell-featured.jpg

在iOS 8中,苹果引入了UITableView的一项新功能--Self Sizing Cells,对于不少开发者来说这是新SDK中一项非常有用的新功能。在iOS 8之前,如果想在表视图中展示可变高度的动态内容时,你需要手动计算行高,而Self Sizing Cells为展示动态内容提供了一个解决方案。以下是你使用Self Sizing Cells时需要注意的事项:

1.为原型单元格定义Auto Layout约束

2.指定表视图的estimatedRowHeight 

3.将表视图的rowHeight属性设置为UITableViewAutomaticDimension

如果用代码表示最后两点,那就是

1
2
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension

仅有两行代码,你通知表视图计算单元格的尺寸以匹配内容和和动态进行渲染。Self Sizing Cells功能可以为你节省大量写代码的时间,你喜欢爱上它!

使用Self Sizing Cells构建简单的Demo

学习新知识的最好办法莫过于使用它,我们将要开发一个简单的Demo来阐释Self Sizing Cell。我们从工程模板开始,一个简单的以表为主的应用展示了旅店列表。原型单元格包含两个单行的文本标签,一个是名称,一个是地址。下载并运行示例工程,你会看到以下界面:

54.png

有图所知,由于行高是固定的,所以一些旅店的地址被缩短了。在开发者包含大量表视图的应用时,你可能会经常遇见此类问题。过去,你可能需要通过缩小文本大小或者增加行数来解决该问题。不过从iOS 8以后,你所需要的是使用Self Sizing Cells来正确展示单元格内容,无论内容有多长。

添加Auto Layout约束

你可能会厌恶并尽量避免使用Auto Layout。不过没有Auto Layout,Self Sizing Cells功能也是无法工作的,它依赖约束来确定合适的行高。事实上,表视图会调用systemLayoutSizeFittingSize并返回基于布局约束的单元格尺寸。

如果你是头一次使用Auto Layout,推荐你先看下Auto Layout Introduction。

本文所用的项目模板并没有使用Auto Layout约束,所以我们要首先添加一个。对于旅店名称标签,点击自动布局菜单的"Pin"按钮,并添加4个间距约束。

555.png

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

556.png

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

557.png

设置预估行高

配置完自动布局后,接下来要在ViewController的viewDidLoad方法中添加如下代码:

1
2
tableView.estimatedRowHeight = 68.0
tableView.rowHeight = UITableViewAutomaticDimension

第一行代码设置了单元格的预估行高,就是现有的原型单元格的高度。第二行代码是改变UITableViewAutomaticDimension的rowHeight属性,这是iOS 8中默认的行高。换句话说,你通知表视图基于其他信息来算出单元格的尺寸大小。

如果你测试应用,那么会发现单元格此时是不可调整的,原因是旅店的名称和地址标签被设定在一行代码中,所以将代码行数设定为零,并允许标签自动增长。

60.png

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

611.png

A Bug?!

我不确定这是不是一个bug,但是UseYourLoaf也注意到了这个问题(博文:Self Sizing Table View Cellshttp://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html)。当首次展示表视图时,你会发现一些单元格不能正确调整大小。但是当你滚动表视图时,新单元格的行高是正确的。你可以在视图展示后强制重载以解决这个问题。

1
2
3
4
5
    override func viewDidAppear(animated: Bool) {
     
        tableView.reloadData()
     
    }

Dynamic Type

Self Sizing Cell对于支持Dynamic Type非常有用。你可能没听说过Dynamic Type,但你可能见过系统的“Settings”屏幕:

71.png

Dynamic Type最初由iOS 7引入,允许用户自定义文本大小从而满足app的需要。不过仅有采用Dynamic Type的app才能响应文本的改变,可能只有一小部分第三方应用使用了该功能。

从iOS 8开始,苹果想要鼓励开发者使用Dynamic Type。正如在WWDC session中提到的那样,所有苹果系统级应用都使用了Dynamic Type,并且内置的标签已经有了动态字体。当用户改变文本大小时,这些标签也会改变其大小。

更进一步说,Self Sizing Cell的引入是促进Dynamic Type使用的办法,它可以节省大量写代码调整行高的时间。如果单元格可以自动调整了,那么使用Dynamic Type就很显而易见了。

你只需要从尺寸固定的自定义字体中将字体更改为文本类型(比如标题和内容主体)首选的字体。也就是说当你运行app时,它会适应文本大小的改变。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩精神性尿频怎么办 小孩睡觉前尿频怎么办 生僻字打不出来怎么办 名字里有生僻字怎么办 qq语音红包生僻字怎么办 生僻字上不了户口怎么办 7岁儿童结巴怎么办 小孩咳喘有痰怎么办 都说我不爱说话怎么办 宝宝突然结巴了怎么办 淘宝客户不理人怎么办 遇到不说话客户怎么办 同学群没人聊怎么办 群里没人说话怎么办 儿童说话声音沙哑怎么办 孩子不和外人说话怎么办 同学退群该怎么办 宝宝睡觉枕头湿怎么办 一个多月的小宝宝便秘怎么办 小宝宝便秘拉屎困难怎么办 一岁小宝宝便秘怎么办 客户不听我说话怎么办 微信上客户不理怎么办 小宝宝母乳不够吃怎么办 小宝宝吃母乳拉肚子怎么办 母乳小宝宝吃奶吃不了怎么办 婴儿感冒吐奶怎么办 小孩感冒吐奶怎么办 小孩吐奶怎么办月子 新生儿一直吐奶怎么办 宝宝50天吐奶厉害怎么办 小儿吐奶厉害怎么办 宝宝一直便秘了怎么办 误建了微信群聊怎么办 新生儿大口吐奶怎么办 宝宝喝了就吐奶怎么办 婴儿顿顿吐奶怎么办 说话着急就结巴怎么办 幼儿舌头长泡怎么办 一着急说话结巴怎么办 幼儿舌头又溃疡怎么办