本次介紹2種經(jīng)常用到自動(dòng)調(diào)整行高的cell.一種是向UILabel中寫(xiě)入內(nèi)容,內(nèi)容大小不固定.因此其中l(wèi)abel的size也不確定.另一種,就是其中的某個(gè)控件高度在不斷變化,因此要不斷計(jì)算這個(gè)控件的高度.
演示效果:
主要工具:Masonry框架
第一種:label內(nèi)容動(dòng)態(tài)設(shè)置
由于文字的數(shù)量是不定的,label因此高度是可變的,導(dǎo)致cell的高度可變.因此要使用tableViewCell自動(dòng)設(shè)置行高.
首先,要使用tableViewCell自動(dòng)設(shè)置行高必然要為tableView設(shè)置2個(gè)屬性,即:
table.rowHeight = UITableViewAutomaticDimension;
table.estimatedRowHeight = 100;
文字不定,所以顯示內(nèi)容的label的約束先不做高度約束.定義一個(gè)MASConstraint 屬性來(lái)記錄高度
@interface LabelCell (){
MASConstraint *heightCons;
}
@property (nonatomic, weak)UILabel *redLabel;
@property (nonatomic, weak)UILabel *blueLable;
@end
[blueLabel makeConstraints:^(MASConstraintMaker *make) {
make.leading.equalTo(self.contentView).offset(SideMargin);
make.trailing.equalTo(self.contentView).offset(-SideMargin);
make.top.equalTo(redLabel.bottom).offset(10);
}];
// 設(shè)置contentView的底部約束 始終等于最底部的子控件的底部
[self.contentView makeConstraints:^(MASConstraintMaker *make) {
make.leading.top.trailing.equalTo(self);
make.bottom.equalTo(blueLabel);
}];
在獲取到lable中的內(nèi)容后,計(jì)算這lable的高度,再來(lái)設(shè)置label高度. 即在這內(nèi)容的set方法中完成
- (void)setDText:(NSString *)dText{
_dText = dText;
// NSLog(@"%@",dText);
self.blueLable.text = dText;
// 自動(dòng)計(jì)算這一段文字的高度
NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:FontSize]};
CGRect rect = [dText boundingRectWithSize:CGSizeMake(self.contentView.frame.size.width - SideMargin * 2, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];
[heightCons uninstall];
[self.blueLable updateConstraints:^(MASConstraintMaker *make) {
heightCons = make.height.equalTo(rect.size.height);
}];
}
第二種:cell中含有多個(gè)子控件
同樣使用Masonry進(jìn)行控件約束.在這個(gè)cell中有1個(gè)簡(jiǎn)單的Img以及多個(gè)按鈕.將所有的按鈕放在bgView上進(jìn)行九宮格布局.因?yàn)閎gView上的控件個(gè)數(shù)不定,所以它的高度不是固定的,需要?jiǎng)討B(tài)設(shè)置.
同樣定義一個(gè)MASConstraint 屬性,記錄它的高度
@interface AutoHeightCell (){
MASConstraint *heightCons;
}
@property (nonatomic, weak)UIImageView *icon;
@property (nonatomic ,weak)UIView *bgView;
@end
由上而下做好各控件的約束
// 最下面的控件的底部約束為
[bgView makeConstraints:^(MASConstraintMaker *make) {
make.leading.trailing.equalTo(self.contentView);
make.top.equalTo(icon.bottom);
make.bottom.equalTo(self.contentView);
}];
// 整個(gè)contentView的約束同樣需要處理
[self.contentView makeConstraints:^(MASConstraintMaker *make) {
make.top.trailing.leading.equalTo(self);
make.bottom.equalTo(bgView.bottom);
}];
在數(shù)組的set方法中,此時(shí)已經(jīng)獲取到bgView和cell的確定高度. 再對(duì)bgView的高度進(jìn)行重新約束
// 重新計(jì)算bgView的高度
[heightCons install];
[self.bgView updateConstraints:^(MASConstraintMaker *make) {
heightCons = make.height.equalTo(btnY + BtnHeight);
}];
控件的個(gè)數(shù)是不定的,可以添加子控件.利用9宮格布局,在一個(gè)bgView上將要添加的按鈕都添加上去.最后再添加一個(gè)添加的按鈕.
/**
* 在背景View 九宮格添加 多個(gè)按鈕
*/
- (void)addSubBtns{
NSInteger count = self.dataArr.count;
// NSLog(@"%d",count);
CGFloat btnWidth = ([UIScreen mainScreen].bounds.size.width - Margin * (Column + 1)) / 4;
CGFloat btnHeight = BtnHeight;
for (int i = 0; i < count; i++) {
// 行
int row = i / Column;
int col = i % Column;
UIButton *btn = [self creatMyBtnWithText:self.dataArr[i]];
CGFloat btnX = Margin * (col + 1) + btnWidth * col;
CGFloat btnY = Margin * (row + 1) + btnHeight * row;
btn.frame = CGRectMake(btnX, btnY, btnWidth, btnHeight);
btn.tag = TagPar + i;
[btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
}
// 最后的添加按鈕
UIButton *btn = [self creatMyBtnWithText:@" + "];
[btn addTarget:self action:@selector(addClick) forControlEvents:UIControlEventTouchUpInside];
int row = (int)count / Column;
int col = (int)count % Column;
CGFloat btnX = Margin * (col + 1) + btnWidth * col;
CGFloat btnY = Margin * (row + 1) + btnHeight * row;
btn.frame = CGRectMake( btnX, btnY, btnWidth, BtnHeight);
// NSLog(@"x:%f,y:%f",btnX,btnY);
// 重新計(jì)算bgView的高度
[heightCons install];
[self.bgView updateConstraints:^(MASConstraintMaker *make) {
heightCons = make.height.equalTo(btnY + BtnHeight);
}];
}
點(diǎn)擊添加按鈕調(diào)用cell的回調(diào)block.在回調(diào)block中向輸出到cell中的數(shù)組中添加內(nèi)容.同時(shí)刷新tableView
/**
* 點(diǎn)擊添加按鈕
*/
- (void)addClick{
if (self.callBackBlock) {
self.callBackBlock();
}
}
// cell的回調(diào)block
cell.callBackBlock = ^{
// NSLog(@"添加按鈕");
NSString *str = [NSString stringWithFormat:@"%lu",self.dataArr.count + 1];
[self.dataArr addObject:str];
[self.table reloadData];
};
Demo地址: https://github.com/sun6762/autoHeight.git
后續(xù)文章:iOS 中利用相對(duì)布局和絕對(duì)布局,對(duì)Table中的文字自適應(yīng)調(diào)整行高