触摸单元格后,单元格图像的UIViewContentModeScale模式会静默更改(突出显示)

时间:2012-07-24 06:14:00

标签: objective-c ios uiimageview

编辑:

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

科里的回答并未解决问题,但clipsToBounds确实是一个问题,我很感激他的不断帮助。所以我给他赏金但不接受他的回答作为答案。答案还在风中......

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

我将单元格图像的UIViewContentModeScale模式设置为AspectFill(左图)并且图像已正确显示(填充图像视图但保留方面)。但是,在触摸并按住单元格后,图像将会改变:imageView的框架和contentViewMode会发生变化。 (见左下图的第一个单元格)

这是真的有线,我可以相信基本的东西可能会出错,所以必须有一些我错过的东西。

环境:Xcode 4.3 iOS5.1模拟器&设备。 enter image description here

更新

我使用故事板的检查器设置了UIViewContentMode。

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

UPDATE2:

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

UPDATE4:

- (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]];

}

enter image description here

4 个答案:

答案 0 :(得分:9)

我能够找到一些可能是问题的不同事物。

首先尝试设置clipsToBounds属性:

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

第二个是:

您没有看到这些模式之间的差异的原因是UITableViewCell自动调整其图像视图的大小以适合图像的宽高比。仅当视图的宽高比与图像不同时,内容模式才会起作用。

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

编辑1:

查看代码后,问题可能在于如何处理单元配置。指针可能会在他们不应该被释放时被释放。试试这两个选项:

选项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;
}

答案 1 :(得分:3)

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

答案 2 :(得分:3)

可能是您需要设置自动调整大小(或struts& spring,如果您已经学习了这个术语)。

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

enter image description here

请注意,我已将其设置为在单元格框架内保持大小不变​​,并且命令顶部,底部和左侧尺寸用于拥抱每侧有大量间隙的边缘。

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

答案 3 :(得分:2)

我遇到了一个带有子类UIImageView属性的子类UITableViewCell的类似问题。将此属性的名称从“imageView”更改为其他内容为我解决了问题。