我有一个表示feed的tableview,有三个不同的自定义UITableView单元格。一个(最上面一个)是固体,应该始终存在,但是细胞不足以产生一个产品或一个事件细胞(从DB加载)。事实上,Eventcells有一个textview和一个可以在高度上变化的imageview,所以要正确地查看它们,我会为它们计算正确的高度,然后在heightForRowAtIndexPath中设置高度。我需要以某种方式更新单元格的新高度,所以我做了一个tableview开始/结束更新。但是,当我每次将其加载到视图中时对每个单元格执行此操作时,所有单元格都会在我滚动tableview时开始弹跳并更改内容。
这是我的CellForRowAtIndexPath
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0) {
return [self loadJobInfoCell:indexPath];
} else if (indexPath.section == 1) {
if ([[jobDetailsArray objectAtIndex:indexPath.row] isKindOfClass:[JobProduct class]]) {
return [self loadProductCell:indexPath];
} else if ([[jobDetailsArray objectAtIndex:indexPath.row] isKindOfClass:[JobEvent class]]) {
static NSString *CellIdentifier = @"EventCell";
EventCell *cell = [tableViewRef dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell == nil) {
cell = [[EventCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
JobEvent *currentEvent = [jobDetailsArray objectAtIndex:indexPath.row];
// setting labels and stuff here
// Is there an image to this event?
if (![currentEvent.EventPicture isEqual:[NSNull null]]) {
[[cell largeImage] setImage:currentEvent.EventPicture];
[[cell largeImageHeightConstraint] setConstant:currentEvent.EventPicture.size.height];
NSNumber *height = [NSNumber numberWithFloat:currentEvent.EventPicture.size.height];
[largeImagesDictionary setObject:height forKey:[NSString stringWithFormat:@"%d", indexPath.row]];
} else {
[[cell largeImageHeightConstraint] setConstant:0.f];
}
// set correct height for the textview
NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:14]};
CGRect paragraphRect = [cell.tvText.text boundingRectWithSize:CGSizeMake(204.f, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:attributes context:nil];
[[cell tvTextHeightConstraint] setConstant:paragraphRect.size.height+16.f];
NSNumber *height = [NSNumber numberWithFloat:[[cell tvTextHeightConstraint] constant]];
[eventTextHeightDictionary setObject:height forKey:[NSString stringWithFormat:@"%d", indexPath.row]];
[tableViewRef beginUpdates];
[tableViewRef endUpdates];
return cell;
}
}
return nil;
没有begin / endupdates,它可以正常工作,尽管单元格的高度不正确并被切割。我可以以某种方式更新高度而无需重新加载表格,还是有更好的解决方案来处理整个情况?我已经尝试跟踪哪些单元格已经获得更新,但这不起作用,它仍然会弄乱订单,高度和内容。我已经尝试了我可能想到的每种解决方案组合,但作为新手iOS开发人员甚至不能确定我采取正确的方法解决这个问题。
非常感谢。
编辑: 男人,我是傻瓜..我已经坐下来并计算了高精度指数中的cellforrowatindex的高度,并通过nsdictionaries传递了数据。我用autolayout解决了这个问题,并在heightforrowatindex中预先计算了数据的高度。
答案 0 :(得分:1)
我不确定你的设置,但我这样做的方法是在IB中设置约束,以便图像视图和文本视图将像单元格一样自动扩展。通过这种方式,我不必对代码中的图像视图或文本视图进行任何大小更改,只需更改单元格大小。我的单元格设置如下:
图像视图在x方向上居中,并且对单元格的顶部有一个约束,而从文本视图的底部到顶部有一个约束。文本视图对单元格的边和底部有约束。我在图像视图中放置了一个虚拟图像,并从“编辑器”菜单中选择了“尺寸适合内容” - 这会导致图像视图的高度和宽度约束被删除。
在代码中,我计算图像视图和文本视图的大小,然后在heightForRowAtIndexPath中返回它们的高度之和(加上一个软糖因子)。以下是示例应用的代码:
- (void)viewDidLoad {
[super viewDidLoad];
self.theData = @[@{@"text":@"jkkjhkj kh k jk h hkj hjkhkjh hjkh jk hhkjhjkh jkh hkj hkjh hkjhjkhhkk jk jkh jkhkhkjhjhkjhkjhkkjhjjhk kjhkjh jkh hk h kj h jkh jkh kjh kh hjkhk jhjk", @"Pic":@"pic1.jpg"},@{@"text":@"fjhg lfkgh gjk gjk glkjfhgjkhgjkgh sjkghsjkgsjgjgk jgk hg hdgjlhjhjgjg fgjklfg fghjgk gjlkg hjgh jg jlkgljsdkggjlglgjdlkg hgjlgjfkghjg ljhfg jlskfdg hjgjlkgjlkdf gjfghjlkfgljkgjlkdgjdfghjdgjglhjkg hljkg ljkgljkfgljkgljksdgljkfgjlfg ljfglldkfjgh ljkgjlkf dgfghslfjdgklfjgljfdfgl", @"Pic":@"pic2.tiff"},@{@"text":@"jdkh lj flfh ljs fajlh ljds f", @"Pic":@"pic3.tiff"}];
[self.tableView reloadData];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.theData.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGSize textViewSize = [self.theData[indexPath.row][@"text"] sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(280.f, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
UIImage *pic = [UIImage imageNamed:self.theData[indexPath.row][@"Pic"]];
CGSize imageViewSize = pic.size;
return textViewSize.height + imageViewSize.height + 40;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
RDCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
cell.tv.text = self.theData[indexPath.row][@"text"];
cell.iv.image = [UIImage imageNamed:self.theData[indexPath.row][@"Pic"]];
return cell;
}