如何为 UITableViews 裁剪 cell.imageview.image 中的图像?

Posted

技术标签:

【中文标题】如何为 UITableViews 裁剪 cell.imageview.image 中的图像?【英文标题】:How can I crop images in cell.imageview.image for UITableViews? 【发布时间】:2012-03-10 04:01:28 【问题描述】:

我已经阅读了here、here 和 here 的相关信息 - 但我无法弄清楚。 我有一个 UITableView,它显示一个图像缩略图(宽度为 66 像素),但是当它显示在表格中时,图像不能很好地排列,这会使文本脱落并使事情看起来很粗糙:

这是我尝试将其限制在 cellForRowAtIndexPath 中的这些维度:

UIImage *largeImage = [UIImage imageWithContentsOfFile: uniquePath];
CGRect cropRect = CGRectMake(0, 0, 66, 49); 

CGImageRef imageRef = CGImageCreateWithImageInRect([largeImage CGImage], cropRect);
cell.imageView.image = [UIImage imageWithCGImage: imageRef];

不过好像没什么区别。 如果这是最简单的方法,我不介意在添加缩略图文件时裁剪它,但它需要在 iPhone 和 iPad 上运行。

最简单的解决方案是什么?

CellForRow 方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];


 //Configure the cell...
Story *storyAtCell = [fetchedResultsController objectAtIndexPath:indexPath];

//this should be the sentence object in sentences with an order of 0
NSPredicate *predicateTitle = [NSPredicate predicateWithFormat:@"order=0"];
NSSet *sentences = [[storyAtCell sentences] filteredSetUsingPredicate:predicateTitle];
Sentence *sentenceAtCell = [sentences anyObject];

cell.textLabel.text = sentenceAtCell.text;

NSArray *paths       = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *uniquePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:[sentenceAtCell thumb]];


// This should crop it as you want - you've just got to create cropRect.

UIImage *largeImage = [UIImage imageWithContentsOfFile: uniquePath];


//CGRect cropRect = CGRectMake(0, 0, 66, 50); 
//CGImageRef imageRef = CGImageCreateWithImageInRect([largeImage CGImage], cropRect);

//Discussion here: https://***.com/questions/9643818/how-can-i-crop-images-in-cell-imageview-image-for-uitableviews

UIImageView *cellimage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0 , 66, 50)];
UILabel *labelFrame = [[UILabel alloc] initWithFrame:CGRectMake(0, 0 , 70, 50)];

[cell.contentView addSubview:cellimage];
[cell.contentView addSubview:labelFrame];
[cellimage setImage:largeImage];


//cell.imageView.image = [UIImage imageWithCGImage: cellimage];
//CGImageRelease(imageRef);
[cellimage release];
[labelFrame release];

cell.accessoryType =  UITableViewCellAccessoryDisclosureIndicator;

return cell;

【问题讨论】:

查看我在回答中的最后一条评论 【参考方案1】:

限制 ImageView 大小对我很有用:

UIImageView *cellimage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0 , 107, 70)];
    [cell.contentView addSubview:cellimage];
    [cellimage setImageWithURL:[self.Featured_ImageURLs objectAtIndex:indexPath.row - 1]    
                   placeholderImage:[UIImage imageNamed:@"small_news_default.png"] View:@"Highlights"]; // you have to change this based on your code.
    [cellimage release];

【讨论】:

感谢您的回答 - 这使图像尺寸完美,但它们现在重叠/剪切了我的单元格文本 - 您如何解决这个问题? 制作一个框架超过 107 ..(图像视图宽度)的 Uilabel,并将其添加到 contentView。 UILabel *labelFrame = [[UILabel alloc] initWithFrame:CGRectMake(0, 0 , 70, 50)];只是将图像换成白框而不移动文本。 (我的 imageview 宽度是 66px)。 UIImageView *cellimage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0 , 66, 50)]; UILabel *labelFrame = [[UILabel alloc] initWithFrame:CGRectMake(0, 0 , 70, 50)]; [cell.contentView addSubview:cellimage]; [cell.contentView addSubview:labelFrame]; [单元图像集图像:大图像]; [细胞图像发布]; [labelFrame 发布]; label 应该这样声明... [[UILabel alloc] initWithFrame:CGRectMake(70, 0 , 140, 50)];您必须将其原点设置为大于图像宽度

以上是关于如何为 UITableViews 裁剪 cell.imageview.image 中的图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何为自定义 TableViewCell 和 CollectionView Cell 使用一个 UIView。?

如何为 CoreData 多对多关系编写 NSPredicate

Swift:使用 UITableViews 进行单选

跨各种 UITableViews 的 UITableViewCell 原型单元格

HTML5中,如何为图片制作放大镜效果?

如何为 UITableViewCell 实现抖动动画