自定义不等高cell—storyBoard或xib自定义不等高cell

1.iOS8之后利用storyBoard或者xib自定义不等高cell:

对比自定义等高cell,需要几个额外的步骤(iOS8开始才支持)

  • 添加子控件和contentView(cell的contentView)之间的间距约束(需要代码控制约束)
  • 设置tableViewCell的真实行高和估算行高
// 以下两行代码就被苹果成为self0sizing技术,可惜只能在iOS8及其之后应用

// 告诉tableView所有cell的真实高度是自动计算(根据设置的约束来计算)
self.tableView.rowHeight = UITableViewAutomaticDimension;
// 告诉tableView所有cell的估算高度
self.tableView.estimatedRowHeight = 44;

2.iOS8之前利用storyBoard或者xib自定义不等高cell:

  • 如果cell内部有自动换行的label,需要设置preferredMaxLayoutWidth属性

    • label之所以知道自己的最大宽度,是因为其要显示出来的时候,它会根据自己的左右约束或者宽度约束计算出的最大宽度 preferredMaxLayoutWidth。然后根据最大宽度和内容多少计算出来label的实际高度。但这一切的前提是label要显示出来的时候,如果label不显示,则不计算preferredMaxLayoutWidth,即preferredMaxLayoutWidth = 0。这时需要手动设置 preferredMaxLayoutWidth
    • 因为下面heightForRowAtIndexPath:的cell只是为了计算高度,cell是不会显示出来的,所以cell上面的label也不会显示出来,所以需要手动设置label的heightForRowAtIndexPath的值,这里在cell的awakeFromNib中对 preferredMaxLayoutWidth 进行赋值。
- (void)awakeFromNib
{
    // 手动设置文字的最大宽度(目的是:让label知道自己文字的最大宽度,进而能够计算出自己的frame)
    self.text_label.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 20;
}
  • 设置tableView的cell估算高度
- (void)viewDidLoad {
    [super viewDidLoad];

    // 告诉tableView所有cell的估算高度(设置了估算高度,就可以减少tableView:heightForRowAtIndexPath:方法的调用次数)
    self.tableView.estimatedRowHeight = 200;
}

估算高度的作用:因为tableView继承自UIScrollView,所以tableView需要根据cell的高度来计算出contentSize。如果不设置估算高度,程序启动,首先会调用多次heightForRowAtIndexPath:方法(该次数等于数据模型的count)。但如果设置了估算高度,程序会根据给定的估算高度计算出contentSize(计算方法是:估算高度 * 数据模型的count)。只有cell显示的时候才会调用heightForRowAtIndexPath:方法计算cell的真实高度,这样一来,heightForRowAtIndexPath:方法的调用次数大大降低,同时也大大提高了性能。

  • cell提供一个height的属性,用于返回cell的高度
- (CGFloat)height
{
    // 强制布局cell内部的所有子控件(label根据文字多少计算出自己最真实的尺寸)
    [self layoutIfNeeded];

    // 计算cell的高度
    if (self.status.picture) {
        return CGRectGetMaxY(self.pictureImageView.frame) + 10;
    } else {
        return CGRectGetMaxY(self.text_label.frame) + 10;
    }
}
  • 在代理方法中计算cell的高度
XMGStatusCell *cell;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 创建一个cell(cell的作用:根据模型数据布局所有的子控件,进而计算出cell的高度,但是因为这个cell不会显示,所以需要手动设置cell中label的最大宽度)
    // cell的作用只是为了计算并返回cell的高度,而不是为了返回cell,所以这个cell是打酱油的,这个cell不会被显示在tableView上,既然也不会被回收到tableView的缓存池(因为只有曾经显示到tableView并且已经离开屏幕的cell才会被回收到缓存池)
    if (!cell) {
        cell = [tableView dequeueReusableCellWithIdentifier:ID];
    }

    // 设置模型数据
    cell.status = self.statuses[indexPath.row];

    return cell.height;
}

 

时间: 2024-12-19 10:12:46

自定义不等高cell—storyBoard或xib自定义不等高cell的相关文章

xib自定义cell代码规范

// //  MJTgCell.m //  01-团购 // //  Created by apple on 14-4-1. //  Copyright (c) 2014年 itcast. All rights reserved. // #import "MJTgCell.h" #import "MJTg.h" @interface MJTgCell() @property (weak, nonatomic) IBOutlet UIImageView *iconVi

[BS-13] 创建和注册UITableViewCell及Storyboard和Xib区别

创建和注册UITableViewCell及Storyboard和Xib区别 // 界面创建完成被调用 - (void)viewDidLoad { [super viewDidLoad]; /** 如果采用如下3种方式,为tableView注册了原形Cell,系统会用注册的cell作为显示用的cell和可重用cell,一旦缓冲区中不存在可重用cell,系统会使用注册的原形Cell新实例化一个Cell供程序使用! 因此只要注册了原形Cell,创建cell时就不再需要cell == nil的判断了.

猫猫学IOS(十六)UI之XIB自定义Cell实现团购UI

猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44926809 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果图 自定义Cell 本次主要是自定义Cell的学习 实现自定义Cell主要有三种方法:按照使用的频繁度排序: XIB > 纯代码 > StoryBoard XIB的定义步骤 1> 新建HMTgCell.xib 2> 拽一

(素材源码)猫猫学IOS(十六)UI之XIB自定义Cell实现团购UI

猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8572001 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果图 自定义Cell 本次主要是自定义Cell的学习 实现自定义Cell主要有三种方法:按照使用的频繁度排序: XIB > 纯代码 > StoryBoard XIB的定义步骤 1> 新建HMTgCell.xib 2> 拽一个需要自定义

IOS xib在tableview上的简单应用(通过xib自定义cell)

UITableView是一种常用的UI控件,在实际开发中,由于原生api的局限,自定义UITableViewCell十分重要,自定义cell可以通过代码,也可以通过xib. 这篇随笔介绍的是通过xib自定义cell. 首先通过gif介绍如何创建xib. 然后实现代码部分,要注意的是实现代码的同时要使代码与xib相关联.-如图 下面便是代码,一些解释我在代码中注释了. ViewController.m // // ViewController.m // CX-Xib在tableView中的简单应用

开发进阶18_通过xib自定义Cell

UITableViewController 继承自ViewController,TableViewController自动给我们添加了dataSource和delegate. 里面只有一个UITableView 1.UITableViewController内部默认会创建一个UITableView *tableView 2.UITableViewController内部tableView的delegate和dataSource就是这个UITableViewController 3.UITable

iOS深入学习(UITableView系列4:使用xib自定义cell)

可以通过继承UITableViewCell重新自定义cell,可以像下面一样通过代码来自定义cell,但是手写代码总是很浪费时间, ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 //CustomTableViewCell.h文件 @interface CustomTableViewCell:UITableViewCell @property (nonat

新手教程之使用Xib自定义UITableViewCell

新手教程之使用Xib自定义UITableViewCell 前言 首先:什么是UITableView?看图 其次:什么是cell? 然后:为什么要自定cell,UITableView不是自带的有cell么? 因为在日常开发中,系统自带的cell满足不了客户和开发人员的需求(并且每个cell中的内容\大小\样式相同),我们就需要自定义cell来实现更加优化的功能.比如下面这种 最后:怎么自定义cell? 1.创建一个新的项目,在storyboard中拖入两个imageView,两个label   2

iOS开发-通过xib自定义cell-新闻项目

自定义Cell的两种方法1>通过xib来自定义cell (如果位置和宽高固定) 2>通过代码来自定义cell 第一种方法:通过xib来自定义cell(拖控件方便,但是2个重用标识要改为一样) 将控制器头文件中继承的UIViewController改为继承UITableViewController,则系统自动将UITableView的数据源和代理设置为控制器,并且已经遵守了协议,大概实现了数据源方法和代理方法,并且控制器View就是TableView,不存在View里面又有一个TableView