【问题标题】:resizing a UITableViewCell frame issue调整 UITableViewCell 框架问题的大小
【发布时间】:2011-05-13 19:25:56
【问题描述】:

我正在尝试通过以下方式调整 UITableViewCell's 框架的大小:

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

但是,我这样做后它没有调整大小...这是为什么?

这很奇怪,好像我在单元格中添加了 UIToolBar,它会调整大小,但是当我添加 UIView 时,它不会:

[cell.contentView addSubview:sideSwipeView];

【问题讨论】:

  • 嗨 aherlambang... 答案有帮助吗?请选择正确的答案...如果不是,请发表评论,让我们知道它没有帮助。 :)

标签: ios objective-c iphone uitableview


【解决方案1】:

这是它的长短:

  1. 您的单元格宽度由它所在的表格视图的宽度决定。

[编辑:如果是分组表格视图,则单元格比表格视图宽度窄 20 - 60 像素,具体取决于您使用的是 iPhone 还是 iPad。]

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

如果您手动设置单元格的框架,它将毫无用处,除非您使用子类单元格,您希望在其中根据单元格的尺寸添加子视图。

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

我不太确定 UIToolBar,但是您的子视图的框架不会随着单元格框架的变化而改变。

如果您能告诉我们您想要达到的目标,我们可以为您提供解决方案吗?


--------------------编辑----- ---


因此,您需要在点击时动态地将子视图添加到单元格并根据新的子视图调整其高度。这会变得毛茸茸的,所以这里是:

在您的 .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,所有单元格的高度都会变小。

现在,要在点击单元格时将子视图添加到单元格,并动态更改其高度,请在您的 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 并做一个漂亮的小淡入淡出动画并更改您的 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);
}

我没有在此处发布所有代码,因为它是隐含的,并且我发布的内容应该让您顺利完成布尔数组的事情。

不管怎样,你来了。我刚刚自己测试了这段代码,所以它可以工作:)

【讨论】:

【解决方案2】:

如果您想根据某些参数增加单元格的高度,例如。文字、图片、 您必须在代码中实现UITableViewDelegateheightForRowAtIndexPath 方法。

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

【讨论】:

  • +1 表格在布局时不会询问单元格的尺寸。无论好坏,这不是它的工作原理。
  • 我非常清楚这一点,但是现在的问题是,当我在 heightForRowAtIndexPath 内部检查此子视图是否存在时,我可以调整它崩溃的高度。我刚刚添加了这段代码 if ([cell.contentView viewWithTag:5] != nil) optionsHeight = 25;.
  • heightForRow 在 cellForRow 之前被称为 .... 因此崩溃。你的细胞还不“存在”。在 heightForRow 中,您告诉 tableview 将单元​​格渲染到特定高度。此时尚未渲染单元格,因此您无法访问该单元格。
  • @aherlambang :单元格高度由其内容(文本、图像、其他视图)计算。您可以在 heightForRowAtIndexPath 中访问这些(文本、图像、其他视图),并计算准确的高度。
  • @ Siddharth Iyer :没有冒犯朋友,我为您的回答发表评论,而不是为您对我的回答发表评论,正如我现在所读到的,您的回答是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
相关资源
最近更新 更多