自定义组件时可以先将新建任务、除了位置以及组件内容的其他类型初始化放在初始化的函数中,先不指定其具体位置以及组件内容。。
比如:
- (void) initSubView{
//头像
_avatar = [[UIImageView alloc]init];
[self addSubview:_avatar];
//用户名
_userName = [[UILabel alloc]init];
_userName.textColor = WBStatusGrayColor;
_userName.font = WBStatusCellUserNameFont;
[self addSubview:_userName];
}
自定义cell都应该有个数据模型的变量,根据其数据用来初始化自定义组件的位置与内容。比如我这里自定义的一个数据模型类变量。
@property (nonatomic, strong)WeiboMsg *weiboMsg;
然后自定义cell的各个组件有关于数据的初始化任务就放在设置weiboMsg数据的函数中。
- (void)setWeiboMsg:(WeiboMsg *)weiboMsg{
//初始化 - 头像
CGRect avatarRect = CGRectMake(10, 10, WBStatusCellAvatarWidth, WBStatusCellAvatarHeight);
_avatar.image = [UIImage imageNamed:weiboMsg.profileAvatarUrl];
_avatar.frame = avatarRect;
//初始化 - 用户名
CGFloat userNameX = CGRectGetMaxX(_avatar.frame) + WBStatusCellControlSpacing;
CGFloat userNameY = userNameX;
CGSize userNameSize = [weiboMsg.userName sizeWithAttributes:@{NSFontAttributeName: WBStatusCellUserNameFont}];
CGFloat userNameSizeX = userNameSize.width;
CGFloat userNameSizeY = userNameSize.height;
CGRect userNameRect = CGRectMake(userNameX, userNameY, userNameSizeX, userNameSizeY);
_userName.text = weiboMsg.userName;
_userName.frame = userNameRect;
}
对于不确定高度的cell来说有两个解决方法:
一是在cell中定义一个保存高度的变量,在VC创建cell的时候根据其来解决高度问题;
二是直接在VC创建cell并指定cell高度的时候动态计算cell的高度来解决。
1、_wbDetail.numberOfLines = 0;
这里指定微博详细内容的行数为0.默认情况下UILable的行数为1,指定为0则是代表没有限制行数。
2、CGRectGetMaxX(_avatar.frame)与CGRectGetMaxY(_avatar.frame);
这两个函数一个是获取指定控件坐标中X的最大值(最右边位置)以及获取指定控件的Y的最大值(最下边位置);因为在自定义Cell中很多控件的具体位置是不确定的。
3、动态计算UILabel中文字的占高:
首先UILabel的numberOfLines设置为0
CGSize wbDetailSize = [weiboMsg.wbDetail
boundingRectWithSize:CGSizeMake(wbDetailWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:WBStatusCellDetailFont}
context:nil].size;
这个函数主要是根据weiboMsg传递来的wbDetail的字符串长度、指定字体以及字体大小来构建这些文字应该占用的大小。即用来计算多行文字的UILable的高度或宽度。
如果想得到宽度的话,size的width应该设为MAXFLOAT
如果想的到高度的话,size的hight应该设为MAXFLOAT