iOS开发——Autolayout下动态调整单元格高度

情景描述:

有时候我们希望更新某一个单元格的数据,通常的做法是使用reloadData方法更新整个单元格。但是对一些情况是不适用的或者说实现起来比较麻烦。比如说这种简单的“点开”一个单元格

在没点开时,英雄的简介被替换为“点击查看详情”,下载按钮被设为隐藏。

这样的话如果在点开时reload整个表格的数据,表格因为重载数据还是会恢复成没有点开的状态。

 

解决步骤:

使用Autolayout的优点是可以让内容决定单元格的高度。那么有什么办法能在内容改变后动态地调整单元格高度呢? 让我们先从约束入手,把单元格的约束写好,使其能很好适应内容改变前后的状态。(关于TableView的约束可以看这篇文章:http://www.cnblogs.com/zeyang/p/4457888.html

但是你会发现无论怎么改,在单元格点开后,单元格的高度总是没有变。像这样:

原因是我们只告诉了系统单元格的内容变了,系统认为单元格的高度仍然是原来的高度,所以才会压缩内容而不是扩展单元格高度。但是reloadData又会重载整个表格,也不符合要求。

我们有如下方法:

   1:  -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
   2:      //最神奇的地方!!
   3:      [tableView beginUpdates];
   4:      [tableView endUpdates];
   5:  }
   6:  -(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
   7:      //最神奇的地方!!
   8:      [tableView beginUpdates];
   9:      [tableView endUpdates];
  10:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

仅需加上这两句话,每次单元格点选时系统会重新计算单元格的高度,使用Autolayout时无需其他操作,单元格即可以很好的显示出单元格内的内容。

 

参考来源:

[iOS]在tableview中用动画效果改变cell的高度

时间: 2024-10-20 18:07:33

iOS开发——Autolayout下动态调整单元格高度的相关文章

iOS开发——UI_swift篇&UITableView实现单元格展开与隐藏

UITableView实现单元格展开与隐藏 下面是一个列表单元格cell的折叠展开效果的demo. 当点击单元格时会展开该单元格,便于显示一些详情什么的.点击其他单元格原来的会关闭,同时有动画效果. 效果如如下:   代码如下: 1 import UIKit 2 3 class ViewController: UIViewController,UITableViewDelegate, 4 UITableViewDataSource { 5 6 var tableView:UITableView?

[easyui][datagrid]EasyUI DataGrid根据字段动态合并单元格

1.合并方法 /** * EasyUI DataGrid根据字段动态合并单元格 * 参数 tableID 要合并table的id * 参数 colList 要合并的列,用逗号分隔(例如:"name,department,office"); */ function mergeCellsByField(tableID, colList) { var ColArray = colList.split(","); var tTable = $("#" +

05---MVC模式下动态调整Cell高度三部曲

动态调整Cell高度三部曲 我们在做项目开发的过程中经常会遇到每一个cell的高度及cell的子控件的显示个数不同,以我最近开发的微格为例,讲解一下MVC模式动态的调整Cell宽高的三部曲 1>.自定义Cell,重写- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier方法 在此方法中添加所有的可能显示的子控件 子控件的frame通过构建的cellFrame模型进行设置

Linux下动态调整LVM文件系统大小

LINUX下可以通过LVM动态调整一个已挂载的文件系统大小 LV可以根据需求增大或减小,但是LV改变大小以后,在LV中的文件系统也需要相应的改变大小.这个概念非常重要,如果没有相应的调整LV中文件系统的大小,那么可能导致数据误用! 扩展文件系统: 1.umount掉文件系统 2.先加LV e2fsck -f /dev/VG00/LV01    必须检查,lvresize要求 lvresize -L +1G /dev/VG00/LV01    (变成+了,参数的使用非常直观)(resize命令可直

EasyUI DataGrid根据字段动态合并单元格

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fn" uri=&

JQuery EasyUI DataGrid动态合并单元格

/**        * EasyUI DataGrid根据字段动态合并单元格        * @param fldList 要合并table的id        * @param fldList 要合并的列,用逗号分隔(例如:"name,department,office");        */        function MergeCells(tableID, fldList) {            var Arr = fldList.split(",&quo

实操记录之-----Ant Design of Vue 增强版动态合并单元格,自动根据数据进行合并,可自定义横纵向合并

前几天搞了个简易版的动态合并单元格 但是需求有变化,就只能稍微改改了~~ 欢迎路过的各位大佬指出我代码的问题~~~~ 另: 代码执行效率不是很高,如果需要大量渲染更多数据建议可以直接使用原生 <template> <page-view :title="title"> <h1>第一種數據結構,前端渲染</h1> <div class="snall-table-spacing"> <a-table :co

uitable单元格高度自动适配

uitable单元格高度自动适配的前提是你要开启auto layout选项,不明白或者不熟悉的同学先看看这里 http://lvwenhan.com/ios/430.html 按照很多用例上的步骤,不想却踩了坑: 1,禁止实现代理函数 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 2,然后实现 - (CGFloat)tableView:(UITable

快速开发平台网格部件合并单元格。

度量快速开发平台中网格部件中的单元格,在合并的时候触发,根据实现代码的内容来判断哪些单元格可以合并,哪些单元格不能合并.注意:要启用单元格合并事件,需要先设置网格部件的属性“允许单元格合并”:勾上后表示网格中所有字段.只要值相同的行,都自动合并.因此,我们一般是在单元格合并事件中设置哪些条件不合并. 该事件需要使用事件参数,Me.GetEventArgs().事件参数共有五个值,如下所示 dim e1=Me.GetEventArgs() e1.FieldName:合并事件中的列名称,那一个字段需