本文转载至 http://www.cocoachina.com/ios/20140922/9717.html

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相关推荐

  1. 可变cell,自适应cell,理解iOS 8中的Self Sizing Cells和Dynamic Type

    在iOS 8中,苹果引入了UITableView的一项新功能--Self Sizing Cells,对于不少开发者来说这是新SDK中一项非常有用的新功能.在iOS 8之前,如果想在表视图中展示可变高度 ...

  2. 深入理解 iOS 开发中的锁

    深入理解 iOS 开发中的锁 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知 ...

  3. 如何深入理解 iOS 开发中的锁?

    摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...

  4. 深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求(上)

    2019独角兽企业重金招聘Python工程师标准>>> 深入理解HTTPS及在iOS系统中适配HTTPS类型网络请求 一.引言 本篇博客主要讨论如何在客户端与服务端之间进行HTTPS ...

  5. 理解:iOS开发中锁的实现原理

    摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大量的实战经验,另一方面这样的文章相当多,比如 iOS中保证线程安全的几种方式与性能对比.iOS 常见知识点(三):Lock.本文也不 ...

  6. iOS 开发中的 Flux 架构模式

    本文讲的是iOS 开发中的 Flux 架构模式, 在半年前,我开始在 PlanGrid iOS 应用程序中采用 Flux 架构(开发).这篇文章将会讨论我们从传统的 MVC 转换到Flux的动机,同时 ...

  7. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  8. 在iOS 8中使用UIAlertController

    本文转载至 http://www.cocoachina.com/ios/20141126/10320.html iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨 ...

  9. 理解 iOS 和 macOS 的内存管理

    在 iOS 和 macOS 应用的开发中,无论是使用 Objective-C 还是使用 swift 都是通过引用计数策略来进行内存管理的,但是在日常开发中80%(这里,我瞎说的,8020 原则嘛?)以 ...

  10. iOS开发UI篇—iOS开发中三种简单的动画设置

    [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要"参与到"动画中 [UIView beginAnimations: ...

最新文章

  1. Spring @Lazy
  2. multipart/form-data和application/x-www-form-urlencoded的区别
  3. [转] MongoDB 入门
  4. 单机/伪分布式Hadoop2.4.1安装文档
  5. 前端模板Nunjucks简介
  6. 数学图形(1.35)Kappa curve
  7. java 获取文件大小_利用百度AI OCR图片识别,Java实现PDF中的图片转换成文字
  8. android 组件大小,Android编程获取组件尺寸大小的方法
  9. 机器为什么可以学习(2)---一般化理论
  10. 迁移学习(Transfer Learning)
  11. 央妈:银联,想说爱你不容易
  12. Photoshop插件-删除所有亮度通道蒙板-脚本开发-PS插件
  13. 【民大Linux课件】Linux的基础操作1
  14. 修改Google浏览器默认打开是金山毒霸网址
  15. 温度转换程序python代码_python温度转换华氏温度实现代码
  16. CVTE+网易+微盟面经
  17. 光遇服务器修复暴风眼刷新了吗,光遇暴风眼怎么进 光遇暴风眼刷新时间
  18. 学计算机的高数学什么,儿子大一,学的计算机科学与技术,感觉高数特别难,都学不会怎么办呢?有什么好办法?...
  19. Rails启动项一些参数的调整
  20. cut命令的详细用法

热门文章

  1. Python cannot import name 'Line' from 'pyecharts'
  2. SQL Server 存储
  3. maven jetty指定端口启动
  4. 2016年10月20日 .NET Core 1.0.2 更新
  5. 菜鸟从零学编程——GET与POST
  6. python异常捕获try except
  7. 在ASP.NET中自动给URL加上超级链接
  8. 一个canvas的demo
  9. POJ 3597 Polygon Division (DP)
  10. HDU 2577 How to Type (DP,经典)