在項(xiàng)目開發(fā)中梳杏,我們經(jīng)常會(huì)使用到UITableViewCell恩急,不管是我們自定義UITableViewCell還是使用系統(tǒng)的cell都免不了要計(jì)算cell的高度掖看,這里我提供兩種方式來計(jì)算cell的高度
1. 純代碼+masonry
使用原理:用masonry來添加約束芹枷,UITableView自適應(yīng)高度
適用場景:任何cell
第一步:首先使用cocoapods安裝masonry 弟孟,cocoapods的詳細(xì)安裝點(diǎn)這里
第二步:新建cell后,初始化各種控件亚斋,使用masonry為其添加約束作媚,在這里我們就基本上告別了initWithFrame方法,再也不用為給x伞访,y掂骏,width,height而煩惱了
//兩個(gè)Label控件
UILabel *photo = [[UILabel alloc] init];
photo.text = @"附件啊佛劍分說家分店減肥了大家發(fā)多了幾分老大金利科技鄧麗君看來是減肥垃圾費(fèi)來得快積分來得及法律肯德基費(fèi)老大勁鋒利的積分累計(jì)的房間大放假啦幾點(diǎn)幾放辣椒放假會(huì)計(jì)法看電視積分";
photo.numberOfLines = 0;
photo.font = [UIFont boldSystemFontOfSize:15];
[self.contentView addSubview:photo];
//為photo添加約束
[photo mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(5);
make.left.mas_equalTo(16);
make.right.mas_equalTo(-16);
}];
UILabel *detialPhoto = [[UILabel alloc] init];
detialPhoto.font = [UIFont systemFontOfSize:14];
detialPhoto.numberOfLines = 0;
detialPhoto.text = @"這張照片記錄了我們?nèi)松谐砷L的步伐厚掷,記錄了許多甜蜜或悲傷的一瞬間弟灼,見證了我們成長的點(diǎn)滴,從中我們可以感受到兒時(shí)的天真冒黑、少年時(shí)的率性田绑。每一個(gè)回憶都是那么珍貴,每當(dāng)回憶時(shí)抡爹,就會(huì)真真切切的感受到那是的可笑掩驱,就好想讓時(shí)光逆流回到以前,讓一切從頭再來冬竟,仿佛以前都是一場夢欧穴,我總怕夢會(huì)突然醒來,真想讓美好泵殴、幸福的一瞬間的心情也被定格下來涮帘,不過這是不可能的";
[self.contentView addSubview:detialPhoto];
//為detialPhoto添加約束
[detialPhoto mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(photo.mas_bottom).with.offset(10);
make.left.equalTo(photo.mas_left);
make.right.equalTo(photo.mas_right);
}];
第三步:給出預(yù)估高度,
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
//計(jì)算cell的高度
return UITableViewAutomaticDimension
}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44; (這里給預(yù)估高度即可)
}
2. xib計(jì)算高度
使用原理:使用xib對控件添加約束笑诅,系統(tǒng)自動(dòng)計(jì)算cell的高度
使用優(yōu)點(diǎn):自動(dòng)計(jì)算cell的高度调缨,無需我們操心
使用缺點(diǎn):一定要在垂直方向添加好約束,否則無法計(jì)算吆你,并且對使用約束的要求較高
第一步:創(chuàng)建好自定義的cell弦叶,并對其中的控件添加好約束,同時(shí)設(shè)置控件的一些必要屬性
第二步:連線、賦值砌梆,對于需要換行顯示的控件默责,需要對其設(shè)置preferredMaxLayoutWidth屬性贬循,否則無法正常計(jì)算高度
- (void)awakeFromNib {
self.fullText.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 48;
self.fullDetialText.preferredMaxLayoutWidth = [UIScreen mainScreen].bounds.size.width - 48;
self.fullText.text = @"附件啊佛劍分說家分店減肥了大家發(fā)多了幾分老大金利科技鄧麗君看來是減肥垃圾費(fèi)來得快積分來得及法律肯德基費(fèi)老大勁鋒利的積分累計(jì)的房間大放假啦幾點(diǎn)幾放辣椒放假會(huì)計(jì)法看電視積分";
self.fullDetialText.text = @"這張照片記錄了我們?nèi)松谐砷L的步伐咸包,記錄了許多甜蜜或悲傷的一瞬間桃序,見證了我們成長的點(diǎn)滴,從中我們可以感受到兒時(shí)的天真烂瘫、少年時(shí)的率性媒熊。每一個(gè)回憶都是那么珍貴,每當(dāng)回憶時(shí)坟比,就會(huì)真真切切的感受到那是的可笑芦鳍,就好想讓時(shí)光逆流回到以前,讓一切從頭再來葛账,仿佛以前都是一場夢柠衅,我總怕夢會(huì)突然醒來,真想讓美好籍琳、幸福的一瞬間的心情也被定格下來菲宴,不過這是不可能的";
}
第三步:在控制器中設(shè)置cell的高度
//設(shè)置預(yù)高度,此高度跟xib畫好后contentView的高度一致
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 65;
}
//計(jì)算cell的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
FullCell *cell = (FullCell *)[self tableView:_fullTableView cellForRowAtIndexPath:indexPath];
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height;
}
3. 總結(jié)
在我們項(xiàng)目開發(fā)的過程中趋急,這兩種計(jì)算cell的高度的方式足夠應(yīng)付各種復(fù)雜的界面喝峦,這兩種方式各有優(yōu)劣,針對自己的需求呜达,選擇最簡單的方式進(jìn)行開發(fā)谣蠢,如果你還有其他的方法,歡迎指教.