我有一个代表提要的表格视图,其中包含三个不同的自定义 UITableView 单元格。一个(最上面的)是实心的,应该总是在那里,但是在那个下面的单元格要么是产品单元格,要么是事件单元格(从数据库加载)。问题是 Eventcells 有一个 textview 和一个 imageview 可以在高度上变化,所以为了正确查看它们,我计算了它们的正确高度,然后在 heightForRowAtIndexPath 中设置高度。我需要以某种方式更新单元格的新高度,所以我做了一个表格视图开始/结束更新。但是,当我每次将每个单元格加载到视图中时,当我滚动表格视图时,所有单元格都会开始弹跳并更改内容。
这是我的 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;
如果没有开始/结束更新,它可以正常工作,尽管单元格的高度不正确并且会被剪掉。我可以在不重新加载表格的情况下以某种方式更新高度,还是对整个情况有更好的解决方案?我尝试跟踪哪些单元格已获得更新,但这不起作用,它仍然会弄乱顺序、高度和内容。我已经尝试了我可能想到的所有解决方案组合,但作为一个新手 iOS 开发人员,我什至不确定我是否采取了正确的方法来解决这个问题。
首先十分感谢。
编辑:伙计,我很愚蠢..我已经坐下来计算了在 cellforrowatindex 中插入的 heightforrowatindex 中的高度,并通过 nsdictionaries 传递了中间的数据。我通过自动布局解决了这个问题,并预先计算了 heightforrowatindex 中数据的高度。