2

我有一个非常烦人的问题。我想要做的是将 6 个图像视图绘制到一个单元格中。在以下屏幕上,您会看到我想要实现的目标。

这就是我在 cellForRowAtIndexPath 中所做的

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    for(int i=0;i<5;i++)
    {
        float xCoord = 30.0;
        Team *team = [self.fetchedResultsController objectAtIndexPath:indexPath];
        NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:team.image]];
        UIImage* image = [[UIImage alloc] initWithData:imageData];
        UIImageView* imgView = [[UIImageView alloc] initWithImage:image];
        [imgView setFrame:CGRectMake(xCoord,0,66,66)];
        [cell.contentView addSubview:imgView];
        xCoord += imgView.frame.size.width + 5;
        NSLog(@"%f",xCoord);
        [cell.contentView clearsContextBeforeDrawing];
    }


    return cell;
}

有谁能够帮助我?

4

3 回答 3

2

即使在您通过计算在每次迭代中重置回 30 的坐标来修复错误之后x,您仍会遇到重用单元格的问题:您的程序将新UIImageView的 s 添加到单元格中,即使它可能UIImageView已经包含五个对象。经过几轮重用,单元格将有几十个图像相互重叠,对性能产生灾难性影响——尤其是滚动性能。

您应该定义一个自定义子类,UITableViewCell其中添加六个UIImageView对象作为子视图,给它一个这样的方法

-(void)setImage:(UIImage*)image forPosition:(NSUInteger)position;

并在循环中调用这个方法(如果你想要六个图像,循环应该有i <= 5,而不是i < 5它的结束条件)。

编辑:这是一种过于简单的编码方式:

CustomCell.h:

#define NUM_PICS 6

@interface SixPicsCell : UITableViewCell {
    UIImageView *pics[NUM_PICS];
}
-(void)setImage:(UIImage*)image forPosition:(NSUInteger)position;
- (id)initWithStyle:(UITableViewCellStyle)style
    reuseIdentifier:(NSString *)reuseIdentifier
@end

自定义单元格.m:

- (id)initWithStyle:(UITableViewCellStyle)style
    reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        for (int i = 0 ; i != NUM_PICS ; i++) {
            pics[i] = [[UIImageView alloc] initWithImage:nil];
            [pics[i] setFrame:CGRectMake(30+71*i, 0, 66, 66)];
            [self.contentView addSubview:pics[i]];
        }
    }
    return self;
}

-(void)setImage:(UIImage*)image forPosition:(NSUInteger)position {
    pics[position].image = image;
}
于 2012-10-10T10:24:18.750 回答
0

大声笑,我之前已经回答过这个确切的问题。

(到目前为止)最简单的方法是使用 UICollectionView (但您想将 IIRC 推广到 iOS 5)。

为了解决重用和内存的问题(并且还可以在每一行中拥有无限的条目),您可以使用包含自己的 UITableView(旋转 90 度)的自定义 cUITableViewCell。然后这可以显示任意数量的图像,因为每个图像都在它自己的单元格内。

这听起来很复杂,但如果你把它分解,它真的不是。

于 2012-10-10T10:29:58.290 回答
0

这是网格视图的情况..

尝试以下供您参考

int rows  = 5;
int columns = 4 //

for (int j=0; j<rows; j++) {

    int xPos=0;
    for (int i=0; i<columns; i++) {

         UIImageView *backImg=[[UIImageView alloc]initWithFrame:CGRectMake(3+xPos,3+yPos, 104, 140)];
        [backImg setImage:[UIImage imageNamed:@"your image.png"]];
        [backImg setBackgroundColor:[UIColor clearColor]];
          [cell.contentView addSubView:backImg];               

        xPos+=105;



    }//columns end
    yPos +=140;

}//rows end
于 2012-10-10T10:42:58.047 回答