理解iOS 8中的Self Sizing Cells和Dynamic Type
iOS开发Dynamic TypeSelf Sizing
在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。我们从工程模板开始,一个简单的以表为主的应用展示了旅店列表。原型单元格包含两个单行的文本标签,一个是名称,一个是地址。下载并运行示例工程,你会看到以下界面:
有图所知,由于行高是固定的,所以一些旅店的地址被缩短了。在开发者包含大量表视图的应用时,你可能会经常遇见此类问题。过去,你可能需要通过缩小文本大小或者增加行数来解决该问题。不过从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方法中添加如下代码:
1
2
|
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)。当首次展示表视图时,你会发现一些单元格不能正确调整大小。但是当你滚动表视图时,新单元格的行高是正确的。你可以在视图展示后强制重载以解决这个问题。
1
2
3
4
5
|
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相关推荐
- 可变cell,自适应cell,理解iOS 8中的Self Sizing Cells和Dynamic Type
在iOS 8中,苹果引入了UITableView的一项新功能--Self Sizing Cells,对于不少开发者来说这是新SDK中一项非常有用的新功能.在iOS 8之前,如果想在表视图中展示可变高度 ...
- 深入理解 iOS 开发中的锁
深入理解 iOS 开发中的锁 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知 ...
- 如何深入理解 iOS 开发中的锁?
摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...
- 深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求(上)
2019独角兽企业重金招聘Python工程师标准>>> 深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求 一.引言 本篇博客主要讨论如何在客户端与服务端之间进行HTTPS ...
- 理解:iOS开发中锁的实现原理
摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...
- iOS 开发中的 Flux 架构模式
本文讲的是iOS 开发中的 Flux 架构模式, 在半年前,我开始在 PlanGrid iOS 应用程序中采用 Flux 架构(开发).这篇文章将会讨论我们从传统的 MVC 转换到Flux的动机,同时 ...
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- 在iOS 8中使用UIAlertController
本文转载至 http://www.cocoachina.com/ios/20141126/10320.html iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨 ...
- 理解 iOS 和 macOS 的内存管理
在 iOS 和 macOS 应用的开发中,无论是使用 Objective-C 还是使用 swift 都是通过引用计数策略来进行内存管理的,但是在日常开发中80%(这里,我瞎说的,8020 原则嘛?)以 ...
- iOS开发UI篇—iOS开发中三种简单的动画设置
[在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要"参与到"动画中 [UIView beginAnimations: ...
最新文章
- Spring @Lazy
- multipart/form-data和application/x-www-form-urlencoded的区别
- [转] MongoDB 入门
- 单机/伪分布式Hadoop2.4.1安装文档
- 前端模板Nunjucks简介
- 数学图形(1.35)Kappa curve
- java 获取文件大小_利用百度AI OCR图片识别,Java实现PDF中的图片转换成文字
- android 组件大小,Android编程获取组件尺寸大小的方法
- 机器为什么可以学习(2)---一般化理论
- 迁移学习(Transfer Learning)
- 央妈:银联,想说爱你不容易
- Photoshop插件-删除所有亮度通道蒙板-脚本开发-PS插件
- 【民大Linux课件】Linux的基础操作1
- 修改Google浏览器默认打开是金山毒霸网址
- 温度转换程序python代码_python温度转换华氏温度实现代码
- CVTE+网易+微盟面经
- 光遇服务器修复暴风眼刷新了吗,光遇暴风眼怎么进 光遇暴风眼刷新时间
- 学计算机的高数学什么,儿子大一,学的计算机科学与技术,感觉高数特别难,都学不会怎么办呢?有什么好办法?...
- Rails启动项一些参数的调整
- cut命令的详细用法