SDAutoLayout
下载链接
SDAutoLayout 基础版视频教程:
http://www.letv.com/ptv/vplay/24038772.html
SDAutoLayout 进阶版视频教程:
http://www.letv.com/ptv/vplay/24381390.html
SDAutoLayout 原理简介视频教程:
http://www.iqiyi.com/w_19rt0tec4p.html
个人觉得自适应TableView的高度这块比较好用,增加约束这一块的话,如果不是必须要纯代码编写项目,还是在Xib、storyboard里增加约束效率较高,对原Demo有兴趣的可以
点击链接下载
,以下只截取主要部分代码:
YXTableViewController.m
/*
自适应TableView,有三种方式:
1.最早版,需要三步:
1.1 设置cell高度自适应:
cell布局设置好之后调用此方法就可以实现高度自适应(注意:如果用高度自适应则不要再以cell的底边为参照去布局其子view)
[cell setupAutoHeightWithBottomView:_view4 bottomMargin:10];
1.2 在返回行数的代理方法里,增加一个方法[tableView startAutoCellHeightWithCellClass:[YXTableViewCell class] contentViewWidth:[UIScreen mainScreen].bounds.size.width],如下:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
[tableView startAutoCellHeightWithCellClass:[YXTableViewCell class] contentViewWidth:[UIScreen mainScreen].bounds.size.width];
return _contenArray.count;
}
1.3 在返回行高度的代理方法里返回高度,如下:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGFloat height = [tableView cellHeightForIndexPath:indexPath model:_contenArray[indexPath.row] keyPath:@"model"];
return height;
}
2.上面方法的简约版,其实就是把1.2和1.3两个方法合为一个方法,需要两步:
2.1 设置cell高度自适应:
// cell布局设置好之后调用此方法就可以实现高度自适应(注意:如果用高度自适应则不要再以cell的底边为参照去布局其子view)
[cell setupAutoHeightWithBottomView:_view4 bottomMargin:10];
2.2 获取自动计算出的cell高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
id model = self.modelsArray[indexPath.row];
// 获取cell高度
return [self.tableView cellHeightForIndexPath:indexPath model:model keyPath:@"model" cellClass:[DemoVC9Cell class] contentViewWidth:cellContentViewWith];
}
3.升级版(适应于cell条数少于100的tableview):tableview 高度自适应设置只需要2步:
3.1 设置cell高度自适应:
// cell布局设置好之后调用此方法就可以实现高度自适应(注意:如果用高度自适应则不要再以cell的底边为参照去布局其子view)
[cell setupAutoHeightWithBottomView:_view4 bottomMargin:10];
3.2 >> 获取自动计算出的cell高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 获取cell高度
return [self cellHeightForIndexPath:indexPath cellContentViewWidth:[UIScreen mainScreen].bounds.size.width];
}
*/
#import "YXTableViewController.h"
#import "YXTableViewModel.h"
@interface YXTableViewController ()
{
NSMutableArray *_contenArray;
}
@end
@implementation YXTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
if (!_cellClassName) {
_cellClassName = @"YXTableViewCell";
}
_contenArray = [YXTableViewModel getSourceData];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _contenArray.count;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
Class cellClass = NSClassFromString(_cellClassName);
CGFloat height = [tableView cellHeightForIndexPath:indexPath model:_contenArray[indexPath.row] keyPath:@"model" cellClass:[cellClass class] contentViewWidth:[UIScreen mainScreen].bounds.size.width];
return height;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:_cellClassName];
if (!cell) {
cell = [[NSBundle mainBundle] loadNibNamed:_cellClassName owner:nil options:nil][0];
}
[cell setValue:_contenArray[indexPath.row] forKey:@"model"];
return cell;
}
@end
YXTableViewCell.m
@implementation YXTableViewCell
- (void)awakeFromNib {
[super awakeFromNib];
_iconImgVi = [UIImageView new];
_iconImgVi.backgroundColor = [UIColor redColor];
[self.contentView addSubview:_iconImgVi];
_iconImgVi.sd_layout.leftSpaceToView(self.contentView,8)//距离左边参照物8像素
.topSpaceToView(self.contentView,8)//距离上边参照物8像素
.widthIs(50)//宽等于50像素
.heightIs(50);//高等于50像素
_titleLab = [UILabel new];
_titleLab.backgroundColor = [UIColor lightGrayColor];
[self.contentView addSubview:_titleLab];
_titleLab.sd_layout.leftSpaceToView(_iconImgVi,8)
.topSpaceToView(self.contentView,8)
.rightSpaceToView(self.contentView,8)
.heightRatioToView(_iconImgVi,0.4);//高度等于_iconImgVi高的0.4倍数
_contentLab = [UILabel new];
_contentLab.backgroundColor = [UIColor greenColor];
[self.contentView addSubview:_contentLab];
_contentLab.sd_layout.leftEqualToView(_titleLab)//_contentLab的x==_titleLab的x
.topSpaceToView(_titleLab,8)
.rightEqualToView(_titleLab)//_contentLab距离右边参照物的空间==_titleLab距离右边参照物的空间
.autoHeightRatio(0)//根据文字内容,自适应高度
.minHeightIs(10);//最小高度为10像素
_describeLab = [UILabel new];
_describeLab.backgroundColor = [UIColor cyanColor];
[self.contentView addSubview:_describeLab];
_describeLab.sd_layout.leftEqualToView(_titleLab)
.topSpaceToView(_contentLab,8)
.rightEqualToView(_titleLab)
.autoHeightRatio(0);
// cell高度自适应
[self setupAutoHeightWithBottomView:_describeLab bottomMargin:8];
}
- (void)setModel:(YXTableViewModel *)model {
self.titleLab.text = model.titleStr;
self.contentLab.text = model.contentStr;
self.describeLab.text = model.describeStr;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
@end
这里采用的是单Cell第二种方法,
2.1 设置cell高度自适应:
// cell布局设置好之后调用此方法就可以实现高度自适应(注意:如果用高度自适应则不要再以cell的底边为参照去布局其子view)
[cell setupAutoHeightWithBottomView:_view4 bottomMargin:10];
2.2 获取自动计算出的cell高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
id model = self.modelsArray[indexPath.row];
// 获取cell高度
return [self.tableView cellHeightForIndexPath:indexPath model:model keyPath:@"model" cellClass:[DemoVC9Cell class] contentViewWidth:cellContentViewWith];
}
Demo里有多Cell的自适应方法,原理是一样的,还有定义自适应控件和配合用Xib增加约束Cell的自适应,非常简单,感兴趣的可以看一下。
版权声明:本文为ITMan_iOS原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。