2

セルに可変高さの画像のみが含まれる UITableView があります。画像に応じて行の高さを動的に設定しますが、完全には機能しません。スクロール中に画像が重なることがあります。コードは次のとおりです...

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [artistfeeds count];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=[self.newsTableView dequeueReusableCellWithIdentifier:@"artistFeedCell"];

    UIImageView *imgView=[[UIImageView alloc]initWithImage:((ESArtistFeedObject*)[artistfeeds objectAtIndex:indexPath.section]).image];
    [cell.contentView addSubview:imgView];
    [cell.contentView sizeToFit];
    return  cell;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat height=((ESArtistFeedObject*)[artistfeeds objectAtIndex:indexPath.section]).image.size.height;
    NSLog(@"section: %i, image height: %f",indexPath.section,height);
    return height;
}

-(void)artistFeedFound:(NSNotification*)notification
{
    //NSLog(@"%@",[notification userInfo]);
    artistfeeds=[[NSMutableArray alloc]init];
    if([[[[notification userInfo]objectForKey:@"artistfeed"]objectForKey:@"artist"] isKindOfClass:[NSArray class]])
    {
        for(NSDictionary *tempDict in [[[notification userInfo]objectForKey:@"artistfeed"]objectForKey:@"artist"])
        {
            ESArtistFeedObject *artistFeed=[[ESArtistFeedObject alloc]init];
            artistFeed.name=[tempDict objectForKey:@"name"];
            artistFeed.type=[tempDict objectForKey:@"postType"];
            artistFeed.desc=[tempDict objectForKey:@"postDesc"];
            if(![artistFeed.type isEqualToString:@"photo"])
                artistFeed.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://c0364947.cdn2.cloudfiles.rackspacecloud.com/%@",[tempDict objectForKey:@"artist_image"]]]]];
            else
                artistFeed.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[tempDict objectForKey:@"photo"]]]];
            [artistfeeds addObject:artistFeed];
        }
    }
    [self.newsTableView reloadData];

}

助言がありますか?

4

1 に答える 1

2

再利用するセルがない場合に実際にセルを作成する cellForRowAtIndexPath のコードがありません。

//assuming there is a class property `int cellImageTag = 100;`
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=[self.newsTableView dequeueReusableCellWithIdentifier:@"artistFeedCell"];
    UIImageView *imgView;
    if(cell == nil)
    {
      cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"artistFeedCell"];
      imgView = [[UIImageView alloc] init];
      imgView.tag = cellImageTag;
      [cell.contentView addSubview:imgView];
    }
    else
    {
      imgView = [cell.contentView viewWithTag:cellImageTag];
    }
    imgView.image = ((ESArtistFeedObject*)[artistfeeds objectAtIndex:indexPath.section]).image;
    [cell.contentView sizeToFit];
    return  cell;
}

編集:ストーリーボードに関するコメントを逃した

edit2:これは、セルをロードするたびに新しい UIImageView サブビューを作成して追加したことが原因だと思います。ストーリーボードがセルの再利用をどのように処理するかはわかりませんが、一般に、クラスにはタグ ivar または定数があり、セル内で再利用するビューのタグを追跡します。例として私のコードを更新します。

edit3:次のコードはストーリーボードで機能するはずです

//assuming there is a class property `int cellImageTag = 100;`
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=[self.newsTableView dequeueReusableCellWithIdentifier:@"artistFeedCell"];
    UIImageView *imgView = [cell.contentView viewWithTag:cellImageTag];
    if(!imgView)
    {
      imgView = [[UIImageView alloc] init];
      imgView.tag = cellImageTag;
      [cell.contentView addSubview:imgView];
    }
    imgView.image = ((ESArtistFeedObject*)[artistfeeds objectAtIndex:indexPath.section]).image;
    [cell.contentView sizeToFit];
    return  cell;
}
于 2012-06-25T15:49:16.960 に答える