调整UITableViewCell框架问题的大小

ahe*_*ang 1 iphone objective-c uitableview ios

我试图UITableViewCell's通过以下方式调整框架大小:

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

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

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

[cell.contentView addSubview:sideSwipeView];
Run Code Online (Sandbox Code Playgroud)

Sid*_*Sid 8

这是它的长短:

  1. 您的单元格宽度取决于它所在的tableview的宽度.

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

  1. 您的细胞高度由该heightForRowAtIndexPath方法确定.

如果您手动设置单元格的框架,那么除非您在使用子类化单元格时根据单元格的尺寸添加子视图,否则它将无用.

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

我不太确定UIToolBar,但你的子视图框架在更改单元框架时不会改变.

也许如果你能告诉我们你想要实现的目标,我们可以为你推荐一个解决方案吗?


-------------------- EDIT --------------------


所以你需要动态添加一个子视图根据新的子视图点击它并调整其高度的单元格.这会变得毛茸茸,所以这里:

在.h文件中声明:

BOOL subviewAdded;
Run Code Online (Sandbox Code Playgroud)

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

subviewAdded = NO;
Run Code Online (Sandbox Code Playgroud)

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

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

这意味着,最初因为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];
}
Run Code Online (Sandbox Code Playgroud)

那么这里会发生的是你正在为你挖掘的这个单元添加一个子视图.重新加载此单元格将调用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);
}
Run Code Online (Sandbox Code Playgroud)

我没有在这里发布所有代码,因为它是隐含的,我发布的内容应该会让你在做布尔数组的事情上做得很好.

无论如何,你在那里.我自己测试了这段代码,所以它有效:)


Jha*_*iya 5

如果您想根据某些参数增加单元格的高度,例如.text,image,你必须 在你的代码中实现heightForRowAtIndexPath方法 UITableViewDelegate.

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)