在iPhone中创建网格表视图

时间:2011-07-04 08:34:07

标签: iphone objective-c uitableview

我想制作一个表格视图,其中我想要显示一些项目或图像(连续4个项目)例如:如果我有7个图像,我想在第一行显示4,在下一行显示3,如果我有13张图像,然后它应分别显示为行1,2,3,4中的4,4,4,1。我已经实现了这个,但我的问题是当我滚动表格视图时,那些图像不断改变它们的位置(从1行换到3行,反之亦然)。请告诉我一些方法,以便我的图像连续4行自动调整,如果我滚动表格视图则不会重复。

我的代码是:

(array has 7 image-datas stored in it) 


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 93;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return [array count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{



    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Avi"];

    for (UIView *view in cell.contentView.subviews) {
        [view removeFromSuperview];
    }
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Avi"] autorelease];
        cell.backgroundColor = [UIColor clearColor];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

    }


    NSData *imageData;


        for(int i=0;i<4;i++){

        imageData=[array objectAtIndex:indexpath.row];

        UIButton *Button = [UIButton buttonWithType:UIButtonTypeCustom];
        Button.frame = CGRectMake(5+(i*77), 5, 77,85);
        [Button setBackgroundImage:[UIImage imageWithData:imageData] forState:UIControlStateNormal];


        [cell.contentView addSubview:Button];


    }

return cell;

1 个答案:

答案 0 :(得分:1)

因此,您发布的代码段并不是特别有用,但这几乎肯定是不能正确回收表格视图的情况。

表视图'循环'它们的单元格的效率和性能 - 当单元格滚出视图时,它被标记为可循环使用:当您下次请求新单元格时,如果有可用的话,您将获得一个可回收的单元格(否则为新的单元格)将创建单元格。

如果您的所有单元格都使用相同的布局,则这不是问题。但是,如果您调整单元格的布局(就像这样),这可能会导致问题,因为您可能已经为2画面布局设置了一个单元格,并将其重新用于4画面单元格。

这里有两个选项:要么注意根据需要重置单元格(当您请求新单元格重置您创建的所有视图参数时,在您的情况下将删除所有超级视图)或创建每种布局都有不同标识符的不同单元格。

顺便说一下,看看你当前的代码,你可能想要考虑一些自定义单元格。目前,您将新图像添加到单元格的内容视图中,这意味着每次您的单元格被回收时,您永远不会删除它们,因此会添加越来越多的图像!效率很低。最好创建一个准备好四个图像视图的单元格,然后根据需要分配image属性。