我在TableView中使用自定义单元格。
单元格高度是根据在单元格的UILabel中加载的NSString计算的。 使用此函数计算大小
(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
NSString *text = [self getTableViewRow:tableView index:indexPath];
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
CGFloat height = MAX(size.height, 44.0f);
return height + (CELL_CONTENT_MARGIN * 2) + 60;
}
正确计算大小但是当单元格加载到uiTableView时,该行的高度正确,但单元格没有。
这是我创建我的手机的地方
//Com Custom Cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"CustomCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCellApresentacao" owner:self options:nil];
if ([nib count] > 0 )
cell = self.tvCell;
else
NSLog(@"Falhou a carregar o xib");
}
NSInteger row = [indexPath row];
if(self.myTableView1 == tableView)
labelDescricaoApresentacao.text = [listData1 objectAtIndex:row];
else if (self.myTableView2 == tableView)
labelDescricaoApresentacao.text = [listData2 objectAtIndex:row];
else
labelDescricaoApresentacao.text = [listData3 objectAtIndex:row];
return cell;
}
我尝试使用
更改此方法中的单元格高度cell.frame.size.height
但它仍未加载正确的高度。
我是否必须在customCell的xib中执行任何操作? 我应该如何将单元格高度更新为相同大小的行?
答案 0 :(得分:4)
你在哪里设置了cell.frame.size.height?我建议试着把它放在这里:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.frame = CGRectMake(0,0,320.0f,30.0f);
}
此方法在显示单元格之前调用,是对单元格进行任何可视更改的好地方。
答案 1 :(得分:2)
如果从NIB(或故事板)加载原型单元格,它们将具有UITableView中定义的相同高度。
来自picciano的解决方案无法在我的应用中使用。
我使用了这个委托功能,它起作用了:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexpath{
CGFloat *theCellHeight=xxx;
//determine here which section/row it is, and the desired height for it, put it in "theCellHeight"
return theCellHeight;
}
希望它对你有帮助,
备注:然而,似乎没有办法获取单元格的内容/引用,因为在该函数内部调用时,cellAtIndexPath会冻结应用程序。所以你必须以编程方式在数组中构建表,然后创建它,这样就不会使NIB变得有用了。
答案 2 :(得分:0)
即使您在heightForRowAtIndexPath
中正确设置行的高度,您的单元格内容也始终具有固定高度,因为您正在从笔尖加载单元格。要动态更改单元格内容高度,您需要使用cellForRowAtIndexPath
heightForRowAtIndexPath:
中以编程方式创建单元格及其子视图
答案 3 :(得分:0)
我的猜测是你没有正确处理细胞的大小调整。
我不确定单元格的框架何时被设置,但是我猜它是在你从tableView:cellForRowAtIndexPath:方法返回一个单元格之后设置的,这意味着单元格被创建或重用,那么它的框架是集。
你应该做的是覆盖单元格的setFrame:方法,并在调用super之后修改它的子视图帧以适应新的大小。
您还可以在Interface Builder上的子视图上使用自动调整遮罩,以便它们自动适应新框架。