调整UITableViewCell框架问题

我想通过调整我的UITableViewCell's框架:

  [cell setFrame:CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height+25)]; 

但是,这样做后我不调整…这是为什么?

这是奇怪的,因为如果我将UIToolBar添加到单元格,它resize,但是当我添加一个UIView,它不:

 [cell.contentView addSubview:sideSwipeView]; 

以下是它的长短:

  1. 你的单元格宽度是由它所在的tableview的宽度决定的。

[编辑:如果它是一个分组表格视图,单元格是20 – 60像素窄于桌面视图宽度,取决于如果您使用的是iPhone或iPad。]

  1. 您的单元格高度由heightForRowAtIndexPath方法确定。

如果您手动设置单元格的框架,除非您使用基于单元格的尺寸添加子视图的子types的单元格,否则将无法使用。

即使在这种情况下,build议使用rectForRowAtIndexPath:(NSIndexPath*)indexPath方法从tableview中获取单元格的框架,然后将该框架设置为单元格的框架(将框架的原点Y设置为0之后)。

我不太清楚UIToolBar,但是你的子视图的框架在更改单元框架时不会改变。

也许如果你能告诉我们你想要达到的目标,我们可以为你提供一个解决scheme?

– – – – – – – – – – 编辑 – – – – – – – – – –

所以你需要根据新的子视图dynamic地添加一个子视图到一个单元格,并调整它的高度。 这会变得毛茸茸的,所以在这里:

在你的.h文件中声明:

 BOOL subviewAdded; 

在您的.m文件中,在init中,执行:

 subviewAdded = NO; 

假设你希望单元格的高度在没有子视图的情况下是50,在子视图上是100。 因此,你的heightForRow方法应该是:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return (subviewAdded?100.0f:50.0f); } 

这意味着,因为subviewAdded是NO,所有的单元格将有较小的高度。

现在,要添加一个子视图到单元格中,并dynamic地改变它的高度,在你的didSelectRow方法中做这个:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //Get the cell at this indexPath UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath]; if(subviewAdded) { subviewAdded = NO; for(int i = 0; i < [thisCell.contentView.subviews count]; i++) { UIView *thisSubview = [thisCell.contentView.subviews objectAtIndex:i]; [thisSubview removeFromSuperview]; } } else { UIView *someView = [[UIView alloc] initWithFrame:someFrame]; [thisCell.contentView addSubview:someView]; [someView release]; subviewAdded = YES; } NSMutableArray *array = [NSMutableArray array]; [array addObject:indexPath]; [tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationFade]; } 

所以这里会发生什么是你添加一个子视图到你已经挖掘的这个单元格。 重新加载这个单元格将调用heightForRowAtIndexPath并做一个不错的小淡入淡出的animation并改变你的tableview高度。

重要提示:理想情况下,您应该维护一个带有布尔值的NSNumbers数组。 数组的大小应该与您所拥有的tableview单元的数量相同。

在heightForRow中,然后检查这个数组,而不是使用整个tableView的单个布尔值。 这将确保您可以为不同的单元格有不同的高度。

这看起来像这样:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { BOOL thisBool = (BOOL)[[booleanArray objectAtIndex:indexPath.row] boolValue]; return (thisBool?100.0f:50.0f); } 

我没有在这里发布所有的代码,因为它是隐含的,我已经发布了应该把你的方式来做布尔数组的事情。

无论如何,你是。 我只是自己testing这个代码,所以它的工作:)

如果你想增加你的细胞的高度基于一些参数如。 文本,图像,你必须在代码中实现UITableViewDelegateheightForRowAtIndexPath方法。

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath