cell自适应高度

来源:互联网 发布:科普是什么意思网络词 编辑:程序博客网 时间:2024/05/23 02:01

     生气生气

用了下cell自适应高度的方法,最常用的方法是使用:

CGFloat height=[self.myExpandCell.contentViewsystemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height+1;


  具体的网上很多,我只说下大概步奏和常见的坑。

 1.在类中声明个全局cell,

_cacheCell=[self.tableViewdequeueReusableCellWithIdentif生气ier:@"WorkOrderImageCell"];


2.- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
UITableViewCell *cell=[tableViewdequeueReusableCellWithIdentifier:@"Cell"forIndexPath:indexPath];

cell.text=@"...";

}

注意:要加上后面的 forIndexPath:indexPath.


3. -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

_cacheCell.label.text=@"...";

CGFloat height=[_cacheCell.contentViewsystemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height+1;

returnheight;

}
这里需要注意的 (1)_cacheCell.label.text=@"..."; 这句必须写,这个协议方法是在 步奏2 之前执行的,而且步奏2中也 必须再实现一次这个方法,不然label没有数据。

(2)求高度的方法是使用cell的contentView来计算的。

(3)+1是因为contentView的height比cell的height小1。


4.这步很关键:设置label的约束。整个cell的高度必须能直接通过竖直方向约束和高度约束相加计算出值(其他方向约束不能参与计算)。很多cell自适应不成功都是约束问题。


5.第一次用的时候做到这我就以为完了,但是搞了很久都没成功。

(1)设置label.numberOfLines=0; //行数自适应

(2)self.remarkLabel.preferredMaxLayoutWidth=lable.size.width; //这句很重要,这是设置单行最大宽度约束,必须设置,而且这里不建议在Storyboard上设置,在Storyboard上这个值不能随屏幕尺寸大小改变而改变。

ps:(悄悄说)lz被上面这句坑惨了快哭了哭大哭

看了这么多,是不是有点晕?没关系,看LZ终极大招。

只用一步就自适应cell高度!!!

<pre name="code" class="objc"><span style="font-family:Comic Sans MS;font-size:14px;">- (CGFloat)cellHeight {    __block CGFloat cellHeight = 0.0;    [self.contentView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {                if ([obj isKindOfClass:[UILabel class]]) {                        UILabel *label = (UILabel *)obj;           CGFloat labelHeight = [label.text boundingRectWithSize:(CGSize){label.bounds.size.width,NSIntegerMax} options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:label.font} context:nil].size.height - label.bounds.size.height;                       cellHeight += labelHeight;        }    }];    return cellHeight + self.contentView.bounds.size.height;}</span>


上面代码,直接拿走。调用这个方法就可以得到cell高度了, 是不是很简单?让约束见鬼去吧!

不过要注意的是,在计算高度前也要先给label.text 赋值,而且这个计算文本大小的方法是在ios7出来的,大家自己做下系统适配吧,lz偷下懒害羞

欢迎大家完善、指正这个方法,有好的建议请告诉我,三克油!




1 0
原创粉丝点击