在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来创建项目。

转载于:https://www.cnblogs.com/codemakerhj/p/4692581.html

可变cell,自适应cell,理解iOS 8中的Self Sizing Cells和Dynamic Type相关推荐

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

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

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

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

  3. iOS聊天室 简单的对话聊天界面(cell自适应高度)

    文章目录 难点 思路 需要用到的方法的大致解析(只是简单的介绍,如果想要仔细理解推荐再去看看别的博客) GitHub地址 代码 效果图 难点 因为聊天长度不一样,需要设置自适应高度 发送信息后,需要使 ...

  4. IOS Table中Cell的重用reuse机制分析

    2019独角兽企业重金招聘Python工程师标准>>> 解决代码: - (UITableViewCell *)tableView:(UITableView *)tableView c ...

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

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

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

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

  7. iOS开发中那些容易被我们忽略的代码,常用代码集合

    退回输入键盘 - (BOOL) textFieldShouldReturn:(id)textField{ [textField resignFirstResponder]; } CGRect CGRe ...

  8. 原 记录一下iOS开发中琐碎的点点_6

    2019独角兽企业重金招聘Python工程师标准>>> 1. app间跳转 跳转到appstore 找到应用程序的描述链接,比如:http://itunes.apple.com/gb ...

  9. 【IOS】从android角度来实现(理解)IOS的UITableView

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3403124.html   本人从在学校开始到现在上班(13年毕 ...

最新文章

  1. 利用css对shiny页面优化及利用htmlwidgets包创建HTML控件
  2. 洛谷 P2184 贪婪大陆 解题报告
  3. Replace Exception with Test(以测试取代异常)
  4. 3DMAX安装包及近百GB素材资源,以及3D游戏建模教程
  5. 新手做UI?手里有几种常见的界面套路模板素材,你就成功一大半了!
  6. 3d数学基础:图形和游戏开发(第2版)_人教版五年级数学上册教学计划进度表
  7. 智能DBA呼声高、仅20%开发者懂操作系统、芯片人才匮乏,揭晓中国基础软件开发者现状
  8. js判断字符串是否在数组中
  9. 图像增强_MATLAB图像处理之图像增强一
  10. hdu-1173(最短距离)
  11. visio 2019 简单流程图教程
  12. mf4350d驱动下载linux,mf4350d驱动-佳能mf4350d驱动下载 1.0 官方版 - 河东下载站
  13. 一个电脑白痴和一个黑客的超爆笑的对话
  14. 2020中式烹调师(初级)证考试及中式烹调师(初级)实操考试视频
  15. SSD1306-7针脚OLED的使用心得
  16. Couldn‘t terminate the existing process for xxx
  17. 超时锁定计算机,Win10电脑设置锁定屏幕超时怎么办
  18. Using different JDK locations on different processes might cause Gradle to spawn multiple daemon
  19. 【软件开发】Memcached(理论篇)
  20. c语言编程步骤Vision4,【2017年整理】keil_μVision4使用详解教程.pdf

热门文章

  1. springboot整合rabbitMQ-路由模型
  2. windows环境下安装zookeeper教程详解(单机版)
  3. RabbitMQ发布/订阅模式(Publish/Subscribe)
  4. solrcloud配置中文分词器ik
  5. 面向对象程序设计上机练习五(类和对象)
  6. cisco ADSL配置
  7. ?Sized 和 Sized
  8. Coolite Toolkit学习笔记一:AjaxEvent、AjaxMethod和Listeners
  9. Java程序设计语言基础02:Java中的基本数据类型和运算符
  10. 【视频编解码-软件】之FFMPEG交叉编译