热门标签 | 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去产生约束,运行看下效果。


问题解决了。



推荐阅读
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了如何在不重新加载URL的情况下,触发WebView的PictureListener.onNewPicture()方法,以实现页面的重新绘制或渲染。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 探索1000以内的完美数:因数和等于自身
    本文探讨了如何在1000以内找到所有完美数,即一个数的因数(不包括自身)之和等于该数本身。例如,6是一个完美数,因为1 + 2 + 3 = 6。通过编程实现这一过程,可以更好地理解完美数的特性。 ... [详细]
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社区 版权所有