2

私は非常に厄介な問題を抱えています。私がやりたいことは、6 つのイメージビューを 1 つのセルに描画することです。次の画面で、私が達成したいことがわかります。

これは私の 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、セルの再利用に関する問題が発生します。プログラムは、セルに既に 5 つのオブジェクトUIImageViewが含まれている場合でも、セルに新しい を追加します。UIImageView数回の再利用の後、セルには数十枚の画像が重なり合い、パフォーマンス、特にスクロールのパフォーマンスに壊滅的な影響を与えます。

UITableViewCellサブビューとして追加された 6 つのオブジェクトを持つカスタム サブクラスを定義し、UIImageView次のようなメソッドを指定する必要があります。

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

ループ内でこのメソッドを呼び出します (6 つの画像が必要な場合は、ループの終了条件として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

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;
}
于 2012-10-10T10:24:18.750 に答える
0

LOL、私はこの正確な問題について以前にこれに答えました。

これを行う (はるかに) 最も簡単な方法は、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 に答える