1

我有一个带有 CustomCell 的表,在绘制单元格时,我创建了一个 UIImageView 并将其作为子视图添加到 scrollView。该图像还将其 contentMode 设置为 UIViewContentModeScaleAspectFit。问题是当绘制下一个单元格时,如果图像小于前一个图像,那么前一个图像的边界仍然存在。

代码是这样的;

  UIImageView *smallImgView = [[UIImageView alloc]initWithFrame:CGRectMake(picXCount,0, 216, 216)];
  smallImgView.image = nil;
  smallImgView.contentMode = UIViewContentModeScaleAspectFit;

我现在想我应该从图像中收集尺寸并将 CGRectMake 设置为该大小而不是使用 contentMode 但如果有一个简单的修复......

将图像设置为 nil 不起作用,另一个想法是先加载空白图像(这很讨厌)。任何想法,将不胜感激。

编辑

这是细胞方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellID = @"Cell"
    newsItemCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
    if (cell == nil)
    {
        cell = [[newsItemCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
    }
    for(int imgCount = 0; imgCount < [[newsExtraImages objectAtIndex:indexPath.row] count]; imgCount++)
    {
        UIImageView *smallImgView = [[UIImageView alloc]initWithFrame:CGRectMake(picXCount,0, 216, 216)];
        smallImgView.image = nil;
        smallImgView.contentMode = UIViewContentModeScaleAspectFit;
        [smallImgView setImage:[allImages objectAtIndex:[[[newsExtraImages objectAtIndex:indexPath.row] objectAtIndex:imgCount] intValue]]];

        picXCount = picXCount + 216 + 12;

        [cell.newsItemImages addSubview:smallImgView];
    }
    [cell.newsItemImages setContentSize:CGSizeMake(picXCount, 216)];

    return cell;
}

简而言之,它会检查一个 3D 数组以查看该单元格中有多少图像,如果有 5 个,则每次将它们添加到视图时都会创建 UIImageView 5 次。下一个单元格是下一个图像列表,可能只有 3 英寸,依此类推。

picXCount 跟踪在滚动视图 (newsItemImages) 中水平绘制图像的位置。内容也被设置为滚动。

4

2 回答 2

1

在伊万的指导下,我设法做到了,不确定这是最经济的方法,但是......

当图像添加到视图中时,我现在也添加了一个标签。现在有一个 For 循环,它在创建之前查看单元格的滚动视图,它删除了所有不为 0 的子视图(默认值)。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellID = @"Cell"
    newsItemCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID forIndexPath:indexPath];
    if (cell == nil)
    {
        cell = [[newsItemCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
    }

    // Remove the old Subviews from the cells if they are there
    for(UIView *subview in [cell.newsItemImages subviews])
    {
        if (subview.tag != 0 )
        {
            [subview removeFromSuperview];
            NSLog(@"Removing View with Tag : %i", subview.tag);
        }
    }


    for(int imgCount = 0; imgCount < [[newsExtraImages objectAtIndex:indexPath.row] count]; imgCount++)
    {
        UIImageView *smallImgView = [[UIImageView alloc]initWithFrame:CGRectMake(picXCount,0, 216, 216)];


        smallImgView.tag = imgCount + 1;  // I added this, plus one to keep it above 0


        smallImgView.contentMode = UIViewContentModeScaleAspectFit;
        [smallImgView setImage:[allImages objectAtIndex:[[[newsExtraImages objectAtIndex:indexPath.row] objectAtIndex:imgCount] intValue]]];

        picXCount = picXCount + 216 + 12;

        [cell.newsItemImages addSubview:smallImgView];
    }
    [cell.newsItemImages setContentSize:CGSizeMake(picXCount, 216)];

    return cell;
}
于 2013-06-05T10:14:09.073 回答
1

你能提供 cellForRowAtIndexPath 代码吗?我怀疑每次您必须为不同的项目提供单元格时,您都会一遍又一遍地在现有的 UIImageView 上方添加一个新的 UIImageView。当事实证明你可以重用一些单元时,你将 UIImageViews 堆叠在一起。

于 2013-05-31T14:33:41.670 回答