编辑:
我通过创建自定义单元格来解决问题。(但是,还有另一个questions。)但是为什么默认单元格不起作用仍然是个谜......
科里的回答并未解决问题,但clipsToBounds
确实是一个问题,我很感激他的不断帮助。所以我给他赏金但不接受他的回答作为答案。答案还在风中......
================================
我将单元格图像的UIViewContentModeScale
模式设置为AspectFill
(左图)并且图像已正确显示(填充图像视图但保留方面)。但是,在触摸并按住单元格后,图像将会改变:imageView的框架和contentViewMode会发生变化。 (见左下图的第一个单元格)
这是真的有线,我可以相信基本的东西可能会出错,所以必须有一些我错过的东西。
环境:Xcode 4.3 iOS5.1模拟器&设备。
更新
我使用故事板的检查器设置了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]];
}
答案 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,如果您已经学习了这个术语)。
在一个应用程序中,我有一个自定义单元格,左边的图像与你的相似,我的自动调整设置如下图所示:
请注意,我已将其设置为在单元格框架内保持大小不变,并且命令顶部,底部和左侧尺寸用于拥抱每侧有大量间隙的边缘。
除此之外,我相信你是对的,aspectFill是该设置的选择。 clipToBounds真的不应该紧;只有当该视图是另一个视图的子视图时才有必要,在该视图中它应该出现在它的大小大于它是子视图的视图的位置。
答案 3 :(得分:2)
我遇到了一个带有子类UIImageView属性的子类UITableViewCell的类似问题。将此属性的名称从“imageView”更改为其他内容为我解决了问题。