【问题标题】:Drawing 6 imageviews inside 1 cell在 1 个单元格内绘制 6 个图像视图
【发布时间】:2012-10-10 10:11:52
【问题描述】:

我有一个非常烦人的问题。我想要做的是将 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;
}

谁能帮帮我?

【问题讨论】:

    标签: iphone objective-c core-data uitableview


    【解决方案1】:

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

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

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

    并在循环中调用这个方法(如果你想要六张图片,循环应该有i &lt;= 5,而不是i &lt; 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
    

    CustomCell.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;
    }
    

    【讨论】:

    • 好的,我把这个函数放在了我的 customCell.h 中,但是我如何在我的 customCell.m 中实现它呢?
    • 设置图像时如何进入下一个indexPath?
    • @StefGeelen 看看编辑,它应该给你一些关于如何实现这种方法的想法。
    • 它在 pics[position].image = image 处崩溃并出现此错误 -[UILabel setImage:]: unrecognized selector sent to instance 0xa02bf70
    • @StefGeelen 你能把你更新的代码贴在某个地方吗?那里似乎存在内存损坏问题。你在 ARC 上,对吧?
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 你有什么例子吗?
    • 我自己只做过一次。您将需要子类化 UITabelViewCell 并在子类化单元格中添加 UITableView 并使单元格成为 UITabelViewCellDataSource(和委托)。然后在您的第一个表格中,您向单元格传递一组图像。然后在单元格中,您可以显示这些图像。只要您将单元格子类化并保持代码分开,它应该很容易管理。
    【解决方案3】:

    这是一个网格视图的例子..

    尝试以下供您参考

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 2021-07-04
      相关资源
      最近更新 更多