美文网首页iOS 开发 iOS程序猿iOS开发技术分享
[iOS 开发基础]- 动态计算cell行高

[iOS 开发基础]- 动态计算cell行高

作者: MonkeyDKing | 来源:发表于2016-10-12 12:08 被阅读1566次

这几天在网上搜寻技术文章时,简书上的文章总是很合胃口。于是就在简书上面注册了账号,简书上的文章都写的很精髓。这是我第一次在简书上面写文章,多少有点小紧张,文章写的哪里不好,或者哪里有问题,欢迎大家提出来,我会修正。好了这里就不继续瞎扯了,现在进入正题吧。

相信很多初级开发者们对于动态计算cell的行高都很头大,总是计算不好,导致各种问题。这里我就讲一下平时我是怎样计算行高的。有很多种方法,一种是通过约束来动态的计算行高,在《UITableView自动计算cell高度并缓存,再也不用管高度啦!》这篇文章里写的已经很详细了,这里就不详述了。还有一种是提前计算行高保存到模型中,这里先看一下效果图;

这样也实现了动态计算行高,每一个cell都返回不同的高度。具体操作是先将数据模型传入一个计算行高的模型当中,然保存这个模型到数据数组中。通过heightForRowAtIndexPath方法返回不同的行高。

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

WKTableViewCellFrame*cellFrame =self.dataArray[indexPath.row];

returncellFrame.rowHeight;

}

当然单单这样笼统的说,相信大家也很难理解我在说什么,别急听我细细道来。

首先我们和往常一样险些数据模型,有头像,昵称,文章里容。

#import

@interfaceWKFriend :NSObject

@property(copy,nonatomic)NSString*nickname;

@property(copy,nonatomic)NSString*content;

@property(copy,nonatomic)NSString*headImg;

@property(copy,nonatomic)NSString*picture;

+ (instancetype) friendInitWithDict:(NSDictionary*)dict;

@end

#import"WKFriend.h"

@implementationWKFriend

+ (instancetype)friendInitWithDict:(NSDictionary*)dict{

WKFriend*friend = [[WKFriendalloc]init];

[friendsetValuesForKeysWithDictionary:dict];

returnfriend;

}

- (void)setValue:(id)value forUndefinedKey:(NSString*)key{

}

@end

然后根据需求的布局,提前进行cell的行高计算,根据控件数量添加模型属性。

#import

#import"WKFriend.h"

@interface   WKComputeCellFrame :NSObject

@property(assign,nonatomic)  CGRect  headImgFrame;

@property(assign,nonatomic) CGRect   contentFrame;

@property(assign,nonatomic) CGRect   nicknameFrame;

@property(assign,nonatomic) CGRect   pictureFrame;

//rowHeight为计算出的cell行高

@property(assign,nonatomic) CGFloat   rowHeight;

// friends是数据模型

@property(strong,nonatomic) WKFriend  *friends;

@end

添加完成之后,要额外添加cell行高属性和数据模型数据。

这里我们就可以开始布局了,这里提前计算没个控件的frame,然后进行布局。

#import"WKComputeCellFrame.h"

@implementationWKComputeCellFrame

- (void)setFriends:(WKFriend*)friends{

_friends= friends;

self.headImgFrame = CGRectMake( 10, 20, 60, 60);

CGRect  nickName = [friends.nickname boundingRectWithSize:CGSizeMake(MAXFLOAT,MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFontsystemFontOfSize:18]} context:nil];

self.nicknameFrame = CGRectMake( 10, CGRectGetMaxY(self.headImgFrame) + 5, nickName.size.width, nickName.size.height);

CGRect  contentFrame = [friends.content boundingRectWithSize:CGSizeMake(MAXFLOAT,MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFontsystemFontOfSize:15]} context:nil];

self.contentFrame = CGRectMake( 10,CGRectGetMaxY(contentFrame), contentFrame.size.width,contentFrame.size.height);

if(friends.picture) {

//如果需要和qq空间一样,文字下面显示图片就设置图片的大小

self.pictureFrame=CGRectMake( 0, 0, 0, 0);

// 有图片就是返回图片的最大Y值

self.rowHeight=CGRectGetMaxY(self.pictureFrame) + 5;

return;

}

// 没图片就是返回文字的最大Y值

self.rowHeight=CGRectGetMaxY(self.contentFrame) + 5;

}

@end

其实我们自定义cell 的时候,就是文字内容的不确定性,导致我们无法静精确的计算cell的行高。但是我们可以通过这个方法来计算文字的高度。

[CGRect boundingRectWithSize:CGSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFontsystemFontOfSize:18]} context:nil];

然后在我们写数据数组时,将数据模型传入计算模型当中,像这样

for(NSDictionary*dictin_dataArray) {

WKFriend*friend = [WKFriend  friendsInitWithDict:dict];

WKComputeCellFrame *cellFrame = [[WKTableViewCellFrame  alloc]init];

cellFrame.friendMode = friends;

[mutableArray  addObject:cellFrame];

}

传入之后就可以返回行高了,在tableView的delegate的方法中返回不同的行高就行了。

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

WKTableViewCellFrame*cellFrame =self.dataArray[indexPath.row];

returncellFrame.rowHeight;

}

之后在自定义cell的时候,将我们提前计算好的frame赋值给控件就可以了。

-(void)setCellFrame:(WKTableViewCellFrame*)cellFrame{

_cellFrame= cellFrame;

_nickNameLable.frame= cellFrame.nickname;

_headImgView.frame= cellFrame.headImg;

_contentLab.frame= cellFrame.content;

self.nickNameLable.text = cellFrame.friends.nickname;

self.contentLab.text= cellFrame.friends.content;

self.imgView.image= [UIImageimageNamed:cellFrame.friends.headImg];

}

注意的是,Lable的文字大小要和提前计算好的大小一致

// 自定义cell中

UILabel*contentLab = [[UILabelalloc]init];

contentLab.font= [UIFontsystemFontOfSize:15];

contentLab.numberOfLines= 0;

// 计算模型中

CGRect  contentFrame = [friends.content boundingRectWithSize:CGSizeMake(MAXFLOAT,MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFontsystemFontOfSize:15]} context:nil];

这样我们就完成动态的返回cell的行高了。

各位读者姥爷们,文章写的比较匆忙,哪里写的不好希望大家多多指点。

相关文章

网友评论

    本文标题:[iOS 开发基础]- 动态计算cell行高

    本文链接:https://www.haomeiwen.com/subject/apzpyttx.html