这几天在网上搜寻技术文章时,简书上的文章总是很合胃口。于是就在简书上面注册了账号,简书上的文章都写的很精髓。这是我第一次在简书上面写文章,多少有点小紧张,文章写的哪里不好,或者哪里有问题,欢迎大家提出来,我会修正。好了这里就不继续瞎扯了,现在进入正题吧。
相信很多初级开发者们对于动态计算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的行高了。
各位读者姥爷们,文章写的比较匆忙,哪里写的不好希望大家多多指点。
网友评论