先看效果(数据都是为了测试,别在意哈☺)
屏幕快照 2016-11-24 09.03.51.png
因为我这是在一个cell里面做的,并且得让他随着数据的多少自动适应高度(也就是说数据显示出来多高,cell就得创建多高,但这是个悖论, 因为cell创建好了就没法改变高度,但这些标签是cell创建好了才乐意传数据进去创建,烧了我好多脑细胞),好了不多说了,showtime。
cell的.h
@interface WartFallTableViewCell : UITableViewCell
-(void)setCellWithArr:(NSArray *)arr;
@end
这没什么可说的
cell的.m
@implementation WartFulTableViewCell
- (void)awakeFromNib {
[super awakeFromNib];
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
}
//关键方法(其实思路理清楚就不难)
-(void)setCellWithArr:(NSArray *)arr{
CGFloat H_distance = autoScaleH(15.0f);//间距——高
CGFloat W_distance = autoScaleW(13.0f);//间距——宽
CGFloat sum_w = W_distance;//总宽
CGFloat sum_h = 0;//总高
CGFloat one_width = kScreenWidth/2/10.0f;//一个字符所占宽度
CGFloat sum_w_befor = sum_w;
for (int i = 0; i<arr.count; i++) {
//这是随机边框的颜色
NSInteger j = arc4random()%4;
UIColor *bordercolor = kBlueColor;
switch (j) {
case 1:
bordercolor = kBlueColor;
break;
case 2:
bordercolor = kYellowColor;
break;
case 3:
bordercolor = kRedColor;
break;
default:
break;
}
//提取数据的大小
NSString *str = arr[i];
NSInteger numberOfStr = str.length;
//把标签的宽度加入总宽中
sum_w_befor = sum_w;//没有累加前的总宽,为了给label赋位置。
sum_w += W_distance + numberOfStr*one_width;//累加后的宽为了判断是否折行。
if (sum_w>kScreenWidth) {//如果宽度超过了屏幕宽 则折行
sum_w = W_distance;
sum_w_befor = sum_w;
sum_w += W_distance + numberOfStr*one_width;//折行后数据的处理(难点,少了我不少脑细胞)
sum_h+= H_distance+autoScaleH(30);
}
UILabel *textLabl = [[UILabel alloc]initWithFrame:CGRectMake(sum_w_befor, sum_h+H_distance,numberOfStr*one_width, autoScaleH(30))];
textLabl.textAlignment = NSTextAlignmentCenter;
textLabl.layer.cornerRadius = autoScaleH(12);
textLabl.layer.masksToBounds = YES;
textLabl.layer.borderWidth = 1;
textLabl.layer.borderColor =bordercolor.CGColor;
textLabl.font = [UIFont systemFontOfSize:autoScaleW(15)];
textLabl.text = str;
[self addSubview:textLabl];
}
sum_h+=H_distance+H_distance+autoScaleH(30);
// 以下两行是我为了让cell自动适应试的各种方法,但并没什么卵用。
//self.backLabelHeight.constant = sum_h; //这是我用xib做的一个label的约束拉出来的但cell创建以后改变约束并没有什么效果了。
// self.cellHeight = sum_h;//这是我给他添加的类目。(这个方法为了配合这个表里边的其他cell,因为其他cell都是拉约束高度自适应的,宝宝心里苦啊,就这个cell不行)
}
看了上面代码,其实关键的已经完了,但有一个坑就是cell高度不能随着数据的多少自适应,所以只能在UITableView的代理里边设定了(蛋疼!!!)
这是创建的部分
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
WartFulTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"WartFulTableViewCell" forIndexPath:indexPath];
// 这些都是痛啊
// cell = [[WartFulTableViewCell alloc]initWithArr:self.dataModel.yach_project];
[cell setCellWithArr:self.dataModel.yach_project];
return cell;
}
这是返回高度的 在这里再计算一遍(其实也可以用代理传回来,但我懒的用,直接代码复制过来。。。囧!)
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat H_distance = autoScaleH(15.0f);//间距——高
CGFloat W_distance = autoScaleW(13.0f);//间距——宽
CGFloat sum_w = 0;//总宽
CGFloat sum_h = H_distance+autoScaleH(30);//总高
CGFloat one_width = kScreenWidth/2/10.0f;//一个字符所占宽度
for (int i = 0; i<self.dataModel.yach_project.count; i++) {
NSString *str = self.dataModel.yach_project[i];
NSInteger numberOfStr = str.length;
sum_w+=W_distance + numberOfStr*one_width;//累加后的宽为了判断是否折行。
if (sum_w>kScreenWidth) {//如果宽度超过了屏幕宽 则折行
sum_w = W_distance;
sum_w += W_distance + numberOfStr*one_width;
sum_h+= H_distance+autoScaleH(30);
}
}
sum_h+=H_distance;
return sum_h;
}
到此结束了,心碎之旅!(对了,哪位大神,知道cell创建以后,再修改cell高度的方法给我说说)
求虐,求指点!!跪求!
网友评论