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


问题解决了。



推荐阅读
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
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社区 版权所有