iOS8 新特性Self-Sizing Cells,自动计算cell的高度

一、简单介绍

UITableView是iOS开发最常用的一个控件,通过代理和数据源方法,几乎能实现各种各样的列表功能。在这里面,有一个比较重要的属性是行高rowHeight,默认的行高是44px。很显然,默认的高度有时候很难满足这个功能的需求:"cell的高度动态改变"。最常见的就是朋友圈,微博,评论列表类的cell,因为用户评论的内容长度不同,导致cell的高度也不同。

二、旧的解决

那么,以前我们是如何计算cell的高度?我的做法是给每一个模型定义一个cellHeight属性,通过模型提前来计算 (此方法一般为了适配iOS7用),然后在tableView:heightForRowAtIndexPath中拿出模型的这个属性返回即可。这种做法虽然可以,但是毕竟会多写一些代码。针对如此,苹果帮我们在iOS8做了优化。

三、新的出世

Self-Sizing Cells,iOS8新出现的特性,可以自动实现cell高度的计算。我们只需要做三件事:

1、给tableView设置预估高度estimatedRowHeight,提高tableView的滚动性能;

2、给tableView的rowHeight设置自动尺寸UITableViewAutomaticDimension;

3、给cell.contentView中的子控件添加Auto Layout相对约束(top、bottom上下约束必须完整,因为需要自动计算高度),推荐使用mansory约束。

四、两者区别

通过计算去设置cell的行高,除了会添加了多余的多码,影响效率,另外添加性的控件需要重新计算,不利用扩展。

通过Self-Sizing Cells新特性可以省去可不必要的代码,新添加控件只需要调整约束,扩展起来很方便。

五、使用案例

TableViewController

//
// ViewController.m
// cell自动计算行高
//
// Created by 夏远全 on 2017/9/30.
// Copyright © 2017年 夏远全. All rights reserved.
// #import "TableViewController.h"
#import "TableViewCell.h" @interface TableViewController ()
@property (strong , nonatomic)NSMutableArray *dataSource;
@end @implementation TableViewController - (void)viewDidLoad {
[super viewDidLoad]; //预估行高
self.tableView.estimatedRowHeight = ; //自动尺寸
self.tableView.rowHeight = UITableViewAutomaticDimension; //去除空白
self.tableView.tableFooterView = [[UIView alloc] init];
} -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.dataSource.count;
} -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *reuserIdentifier = @"TableViewCell";
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuserIdentifier];
if (!cell) {
cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuserIdentifier];
}
cell.modelDic = self.dataSource[indexPath.row];
return cell;
} -(NSMutableArray *)dataSource{
if (!_dataSource) {
_dataSource = [NSMutableArray array];
[_dataSource addObject:@{@"avatar":@"image1.png",@"name":@"美女与野兽",@"instruction":@"遥映人间冰雪样,暗香幽浮曲临江。 遍识天下英雄路,俯首江左有梅郎"}];
[_dataSource addObject:@{@"avatar":@"image2.png",@"name":@"哪有几回闻",@"instruction":@"iOS基于RTMP的视频推流 一、基本介绍 iOS直播一出世,立马火热的不行,各种直播平台如雨后春笋,正因为如此,也同样带动了直播的技术快速发展,在IT界精通直播技术的猴子可是很值钱的。"}];
[_dataSource addObject:@{@"avatar":@"image3.png",@"name":@"绝天地苍穹",@"instruction":@"中共中央政治局第四十三次集体学习时强调 深刻认识马克思主义时代意义和现实意义 继续推进马克思主义中国化时代化大众化"}];
}
return _dataSource;
}
@end

TableViewCell

//
// TableViewCell.h
// cell自动计算行高
//
// Created by 夏远全 on 2017/9/30.
// Copyright © 2017年 夏远全. All rights reserved.
// #import <UIKit/UIKit.h> @interface TableViewCell : UITableViewCell
@property (strong , nonatomic)NSDictionary *modelDic;
@end
//
// TableViewCell.m
// cell自动计算行高
//
// Created by 夏远全 on 2017/9/30.
// Copyright © 2017年 夏远全. All rights reserved.
// #import "TableViewCell.h"
#import <Masonry.h> @interface TableViewCell ()
@property (strong,nonatomic)UIImageView *avatarView;
@property (strong,nonatomic)UILabel *nameLabel;
@property (strong,nonatomic)UILabel *instrLabel;
@end @implementation TableViewCell #pragma mark - life cycle -(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
[self setup];
}
return self;
} -(instancetype)init
{
if (self = [super init]) {
[self setup];
}
return self;
} -(instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
[self setup];
}
return self;
} -(void)setup
{
[self setupSubViews];
[self setupSubviewsConstraints];
} #pragma mark - add subViews
-(void)setupSubViews{
[self.contentView addSubview:self.avatarView];
[self.contentView addSubview:self.nameLabel];
[self.contentView addSubview:self.instrLabel];
} #pragma mark - layout subviews
-(void)setupSubviewsConstraints { [self.avatarView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.contentView.mas_left).offset();
make.top.mas_equalTo(self.contentView.mas_top).offset();
make.size.mas_equalTo(CGSizeMake(, ));
}]; [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.avatarView.mas_right).offset();
make.right.mas_equalTo(self.contentView.mas_right).offset(-);
make.top.mas_equalTo(self.contentView.mas_top).offset();
}]; [self.instrLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.avatarView.mas_right).offset();
make.right.mas_equalTo(self.contentView.mas_right).offset(-);
make.top.mas_equalTo(self.nameLabel.mas_bottom).offset();
make.bottom.mas_equalTo(self.contentView.mas_bottom).offset(-);//此处cell的高度就被算出来了
}];
} #pragma mark - event response #pragma mark - public methods #pragma mark - private methods #pragma mark - getters and setters
-(void)setModelDic:(NSDictionary *)modelDic{
_modelDic = modelDic; self.avatarView.image = [UIImage imageNamed:modelDic[@"avatar"]];
self.nameLabel.text = modelDic[@"name"];
self.instrLabel.text = modelDic[@"instruction"]; } -(UIImageView *)avatarView{
if (!_avatarView) {
_avatarView = [[UIImageView alloc] init];
}
return _avatarView;
} -(UILabel *)nameLabel{
if (!_nameLabel) {
_nameLabel = [[UILabel alloc] init];
_nameLabel.numberOfLines = ;
}
return _nameLabel;
} -(UILabel *)instrLabel{
if (!_instrLabel) {
_instrLabel = [[UILabel alloc] init];
_instrLabel.numberOfLines = ;
}
return _instrLabel;
} @end

六、演示效果

iOS:通过Self-Sizing Cells新特性自动计算cell的高度的更多相关文章

  1. 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定

    最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...

  2. iOS8以后自动计算cell的高度

    前提: 1.iOS系统>=8 2.cell中的每个控件布局固定,不含一些动态的模块,但是可以含有label的变化 可以采用tableView自动计算cell的高度 首先设置tableView的属 ...

  3. iOS之Xcode8 Auto Layout新特性

    目录 1.Incrementally Adopting Auto Layout 2.Design and Runtime Constraints 3.NSGridView 4.Layout Feedb ...

  4. iOS开发实用技巧—项目新特性页面的处理

    iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性 ...

  5. IOS学习【xcode 7新特性url链接】

    由于xcode7的更新,在访问http链接的时候会输出错误信息 The resource could not be loaded because the App Transport Security ...

  6. iOS 11系列 - Xcode 9新特性

    Xcode 9最近刚刚发布,带来了一系列不错的新特性,可以更好的帮助到开发者完成开发工作. Xcode Runtime Tool Xcode 9中有许多Runtime Tool可以帮助开发者找到代码错 ...

  7. 利用iOS8新特性计算cell的实际高度

    在计算cell的实际高度是 我们一般是通过计算frame  拿到最底部一个控件的最大Y值从而的到cell 的高度  算来算去  比较麻烦 其实,iOS8已经提供了直接通过Cell高度自适应的方法了,根 ...

  8. 【swift,oc】ios开发中巧用自动布局设置自定义cell的高度

    ios开发中,遇到自定义高度不定的cell的时候,我们通常的做法是抽取一个frame类,在frame类中预算好高度,再返回. 但是苹果出来自动布局之后...春天来了!!来看看怎么巧用自动布局设置自定义 ...

  9. iOS9新特性之UIStackView

    同iOS以往每个迭代一样,iOS 9带来了很多新特性.UIKit框架每个版本都在改变,而在iOS 9比较特别的是UIStackView,它将从根本上改变开发者在iOS上创建用户界面的方式.本文将带你学 ...

随机推荐

  1. 统计Mongo数组中相同对象的属性之和

    统计Mongo数组中相同对象的属性之和 需求 需要统计app端用户的行为,按天分表,存入mongo.每次用户进行操作的时候,将数据存入app本地,下次用户启动的时候,提交存入mongo,删除app本地 ...

  2. linux环境下source vimrc提示错误unexpected token `"autocmd"'

    编辑完vimrc之后,使用source /etc/vimrc之后报错: $ source /etc/vimrc bash: /etc/vimrc: line 15: syntax error near ...

  3. C#开发Unity游戏教程之游戏对象的行为逻辑方法

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  4. JDBC之 连接池

    JDBC之 连接池 有这样的一种现象: 用java代码操作数据库,需要数据库连接对象,一个用户至少要用到一个连接.现在假设有成千上百万个用户,就要创建十分巨大数量的连接对象,这会使数据库承受极大的压力 ...

  5. BZOJ.2246.[SDOI2011]迷宫探险(DP 记忆化搜索 概率)

    题目链接 求最大的存活概率,DP+记忆化. 用f[s][x][y][hp]表示在s状态,(x,y)点,血量为hp时的存活概率. s是个三进制数,记录每个陷阱无害/有害/未知. 转移时比较容易,主要是在 ...

  6. 如何处理C++构造函数中的错误——兼谈不同语言的错误处理

    用C++写代码的时候总是避免不了处理错误,一般来说有两种方式,通过函数的返回值或者抛出异常.C语言的错误处理一律是通过函数的返回值来判断的,一般是返回0.NULL或者-1表示错误,或者直接返回错误代码 ...

  7. Nancyfx框架在传统Webform项目中的应用

    最近有个老项目需要做一个需求更迭,老项目是基于传统的webform项目的 为了更好的前后台交互,决定引入Nancyfx框架 关于Nancyfx框架框架是啥就不多介绍了 总的来说是一款轻量级的web框架 ...

  8. linux soname

    在linux下使用动态库时,经常会发现明明编译时指定的是libA.so,可是程序运行时或通过ldd查看依赖却是libA.so.XXX, 原因跟linux下so库的soname有关,查看so库的sona ...

  9. Delphi : Analyze PE file headers?

    Analyze PE file headers? { You'll need a OpenDialog to open a Exe-File and a Memo to show the file i ...

  10. Programming 2D Games 读书笔记(第四章)

      示例一:Game Engine Part 1 更加完善游戏的基本流程 Graphics添加了以下几个方法,beginScene和endScene提高绘图,showBackbuffer去掉了clea ...