热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IOS学习之UITableViewCell动态计算高度(IOS8)

上一篇介绍了AutoLayout的三个属性,后来发现其实和UITableViewCell动态高度的学习关系不大。不过还是有用的,因为AutoLayout涉及到比较复杂的布局,就肯定会用到那三个属

上一篇介绍了AutoLayout的三个属性,后来发现其实和UITableViewCell动态高度的学习关系不大。不过还是有用的,因为AutoLayout涉及到比较复杂的布局,就肯定会用到那三个属性。废话不多说,今天就来学习一下UITableViewCell的动态计算高度问题。这篇的方法仅适用IOS8以上的系统,稍后在写一篇通用的。

计算Cell高度这个问题,苹果终于在IOS8时帮我们做了,也就是self-sizing-cells这个概念。用起来也是很简单的。

1.你的Cell要使用AutoLayout来布局约束这是必须的;

2.设置tableview的estimatedRowHeight为一个非零值,这个属性是设置一个预估的高度值,不用太精确。

3.设置tableview的rowHeight属性为UITableViewAutomaticDimension

就是下面这两行代码

tableView.estimatedRowHeight = 37.0;

tableView.rowHeight = UITableViewAutomaticDimension;


接下来你只需要用AutoLayout布局好Cell,一切就都交给苹果吧。下面看一下例子:

新建一个Master-detail的项目,模版是包括增删当前时间的,我们不需要,稍微改一下,显示一些静态数据就好。记得加上上面的两行代码,修改之后viewDidLoad代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.tableView.estimatedRowHeight = 37.0;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
    self.objects = [NSMutableArray arrayWithArray:@[@"In iOS 8, Apple introduces a new feature for UITableView known as Self Sizing Cells. This is seriously one of the most exciting features for the new SDK. Prior to iOS 8, if you displayed dynamic content in table view with varied row, you need to calculate the row height on your own. In summary, here are the steps to implement when using self sizing cells",@"Add auto layout constraints in your prototype cell",@"Specify the estimatedRowHeight of your table view",@"Set the rowHeight of your table view to UITableViewAutomaticDimension",@"tableView.estimatedRowHeight = 36.0;",@"tableView.rowHeight = UITableViewAutomaticDimension;"]];
}

数据准备好了,接下来我们开始自定义Cell,新建UITableViewCell子类为 DemoTableViewCell,然后我们打开stroyboard。选择Master Scene中TableView的Cell,将Custom Class改成我们新建的DemoTableViewCell。TableViewCell的style改成Custom。把TableView的Row Height改的高一些。我们现在Cell左边放一个图片,设置他的约束如图:


接着右边放一个Label,设置约束如图:


然后打开Assistant editor 把Label连到DemoCell中。如图:


下面修改一下MasterViewController里面tableView的代理方法。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    DemoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.cellText.text = self.objects[indexPath.row];
    return cell;
}
运行看下效果如图:



好吧,原谅我,忘记了一个重要的属性。返回storyboard,将Label的Lines设置成0,代码多行。如图:


运行看下效果


搞定了,和自己计算比起来简直方便太多。

接下来看看如果在原有的Label下面再加一个需要计算高度的Label会是什么效果(Label1,Label2)。这就会涉及到约束优先级的问题了。此时Label1的下边距约束对象应该又superview变成Label2,Label2的上边距约束对象应该是Label1,Label2的下边距约束对象是superview。看下修改后出现的问题


因为两个Label的高度都是不固定的,所以当Cell高度变大时需要设置谁去被拉伸,xcode推荐我们把Label1的抗拉伸优先级调小,我们按照推荐的来。运行一下看效果:


Label1被拉伸了。反过来修改Label1的抗拉伸优先级大于Label2后,Label2会被拉伸。仔细的观察了一下Cell的高度,发现其实Cell的高度是正确的,是Label高度的两倍,只是两个Label的高度出现了问题,我的想法是如果先按正确高度绘制Label1,然后在绘制Label2,就不会出现这个问题了。仔细一想这样不对,因为Label1的下边距和Label2的上边距是互相依靠的,这相当于两个Label的优先级应该一样才可以,谁高于谁都不能正确。但都一样的时候苹果又不是知道要拉伸的时候该拉伸谁。这时候只能把Label1和Label2的之间的关系拆开才行,决定加一个空的View在Cell中间试试,给View加了一个竖直居中的约束,固定高度为1,然后让两个Label都和View去产生约束,运行看下效果。


问题解决了。



推荐阅读
  • 在AngularJS中,有时需要在表单内包含某些控件,但又不希望这些控件导致表单变为脏状态。例如,当用户对表单进行修改后,表单的$dirty属性将变为true,触发保存对话框。然而,对于一些导航或辅助功能控件,我们可能并不希望它们触发这种行为。 ... [详细]
  • 文章目录IntroductionRelatedWork网络稀疏化(NetworkSlimming)whychoosechennel-levelspars ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • 使用R语言进行Foodmart数据的关联规则分析与可视化
    本文探讨了如何利用R语言中的arules和arulesViz包对Foodmart数据集进行关联规则的挖掘与可视化。文章首先介绍了数据集的基本情况,然后逐步展示了如何进行数据预处理、规则挖掘及结果的图形化呈现。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文探讨了如何在游戏启动画面中移除广告,特别是在游戏数据加载期间(大约5-6秒)广告会短暂显示的问题。通过调整XML布局和代码逻辑,可以实现广告的延迟加载或完全移除。 ... [详细]
  • 本文详细介绍了如何使用 Python 编程语言中的 Scapy 库执行 DNS 欺骗攻击,包括必要的软件安装、攻击流程及代码示例。 ... [详细]
  • 深入解析Java并发之ArrayBlockingQueue
    本文详细探讨了ArrayBlockingQueue,这是一种基于数组实现的阻塞队列。ArrayBlockingQueue在初始化时需要指定容量,因此它是一个有界的阻塞队列。文章不仅介绍了其基本概念和数据结构,还深入分析了其源码实现,包括各种入队、出队、获取元素和删除元素的方法。 ... [详细]
  • 本文介绍了如何通过创建自定义 XML 文件来修改 Android 中 Spinner 的项样式,包括颜色和大小的调整。 ... [详细]
  • Exploring issues and solutions when defining multiple Faust agents programmatically. ... [详细]
  • 本文提供了一个SQL脚本,用于在Microsoft SQL Server中创建一个数据字典视图,该视图详细列出了表名、表描述、字段名称、字段描述、字段类型、字段大小、字段精度、是否可为空、默认值以及是否为标识或主键等信息。 ... [详细]
  • 本文详细介绍了如何在PyQt5中创建简易对话框,包括对话框的基本结构、布局管理以及源代码实现。通过实例代码,展示了如何设置窗口部件、布局方式及对话框的基本操作。 ... [详细]
author-avatar
我是小章丘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有