5

编辑:

我通过创建自定义单元格解决了这个问题。(但是,还有其他问题。)但是为什么默认单元格不起作用仍然是一个谜......

Cory 的回答并没有解决问题,但clipsToBounds确实很重要,我感谢他的持续帮助。所以我给了他赏金,但不接受他的答案作为答案。答案还在风中......

=================================

我将UIViewContentModeScale单元格图像的模式设置为AspectFill(左图)并且图像正确显示(填充图像视图但保持纵横比)。但是,触摸并按住单元格后,图像会发生变化:imageView 的 frame 和 contentViewMode 会发生变化。(见下左图的第一个单元格)

这确实是有线的,我可以相信诸如基本的事情可能会出错,所以一定有一些我错过了的东西。

环境:Xcode 4.3 iOS5.1 模拟器和设备。 在此处输入图像描述

更新:

我使用情节提要的检查器设置 UIViewContentMode 。

顺便说一句,我使用了 SDWebImage/UIImageView+WebCache.h。

更新2:

我在代码中明确设置了内容模式,但问题仍然存在。[cell.imageView setContentMode:UIViewContentModeScaleAspectFill];

更新4:

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

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"AlbumCell"];

    }
    //[cell.imageView setContentMode:UIViewContentModeScaleAspectFill];
    //[cell.imageView setClipsToBounds:YES];
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    Album *album = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = [album.title description];    
    cell.detailTextLabel.text = [self.userVisiableDateFormatter stringFromDate:album.releaseDate];


    //[cell.imageView setContentMode:UIViewContentModeScaleAspectFill];
    [cell.imageView setImageWithURL:[NSURL URLWithString:album.coverThumbnailUrl]
                placeholderImage:[self placeHolderImage]];

}

在此处输入图像描述

4

4 回答 4

9

我能够找到可能是问题的几个不同的事情。

首先它尝试设置 clipsToBounds 属性:

img1.contentMode = UIViewContentModeScaleAspectFill; 
img1.clipsToBounds = YES;

第二个是:

您看不到这些模式之间差异的原因是 UITableViewCell 自动调整其图像视图的大小以适应图像的纵横比。只有当视图的纵横比与图像的不同时,内容模式才会发挥作用。

在您的自定义 UITableViewCell 类中覆盖 layoutSubviews 或自己创建一个图像视图(不要使用表格视图单元格提供的那个)。

编辑1:

查看您的代码后,问题可能在于您如何处理单元配置。指针可能会在不应该被释放的时候被释放。尝试以下 2 个选项:

选项 1:保留当前将配置传递给新方法的方法。

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

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"AlbumCell"];

    }

    return [self configureCell:cell atIndexPath:indexPath];
}

- (UITableViewCell*)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell* returnCell = cell;

    Album *album = [self.fetchedResultsController objectAtIndexPath:indexPath];
    returnCell.textLabel.text = [album.title description];    
    returnCell.detailTextLabel.text = [self.userVisiableDateFormatter stringFromDate:album.releaseDate];


    [returnCell.imageView setContentMode:UIViewContentModeScaleAspectFill];
    [returnCell.imageView setClipsToBounds:YES];

    [returnCell.imageView setImageWithURL:[NSURL URLWithString:album.coverThumbnailUrl]
                placeholderImage:[self placeHolderImage]];

    return returnCell;
}

选项 2:(我的建议)在委托方法中配置单元格。可以在这里执行此操作,这不是坏习惯。这是用于配置单元的委托方法。

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

    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"AlbumCell"];

    }


    Album *album = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = [album.title description];    
    cell.detailTextLabel.text = [self.userVisiableDateFormatter stringFromDate:album.releaseDate];

    [cell.imageView setContentMode:UIViewContentModeScaleAspectFill];
    [cell.imageView setClipsToBounds:YES];

    [cell.imageView setImageWithURL:[NSURL URLWithString:album.coverThumbnailUrl]
                placeholderImage:[self placeHolderImage]];


    return cell;
}
于 2012-07-26T18:04:39.117 回答
3

可能是您需要设置自动调整大小(或支柱和弹簧,如果您已经学习了该术语)。

在一个应用程序中,我有一个自定义单元格,左侧的图像与您的类似,我的自动调整大小设置如下图所示:

在此处输入图像描述

请注意,我已将其设置为使单元格框架内的尺寸保持不变,并且命令顶部、底部和左侧尺寸以每边有那么多间隙的方式拥抱这些边缘。

除此之外,我相信你是对的,aspectFill 是该设置的选择。clipToBounds 真的不重要;只有当该视图是另一个视图的子视图时,才需要它应该出现在它的大小大于它是子视图的视图的位置。

于 2012-08-01T06:17:37.360 回答
3

也为突出显示的状态设置相同的图像。

于 2012-07-27T08:06:53.790 回答
2

对于具有子类 UIImageView 属性的子类 UITableViewCell,我遇到了类似的问题。将此属性的名称从“imageView”更改为其他名称为我解决了这个问题。

于 2013-05-23T23:14:50.890 回答