UIImageView,setClipsToBounds和我的图像是如何失去理智

我正在开发一个iOS 4应用程序。

我在UITableViewCellUIImageView上使用这个代码:

 cell.photo.contentMode = UIViewContentModeScaleAspectFill; [cell.photo setClipsToBounds:YES]; 

我的图像比宽度更高,当我设置UIViewContentModeScaleAspectFill ,图像缩放以适应UIImageView宽度的宽度。 这样做,图像变得更大,UIImageView和我看到它在UIImageView之外。

然后,我需要使用setClipsToBounds:YES来不允许这样做,但现在我的所有图像都失去了setClipsToBounds:YES

有什么办法使用UIViewContentModeScaleAspectFill和中心左上angular的图像与左上angular的UIImageViewangular? 如果我需要失去一部分形象,我宁愿失去它的头。

UPDATE

我正在使用sdWebImage框架,我已经使用了Vadim Yelagin答案,现在是我的代码:

 [cell.photo setImageWithURL:[NSURL URLWithString:entry.photo] placeholderImage:[UIImage imageNamed:@"placeholder.png"] success:^(UIImage *image) { CGFloat scaleX = cell.photoBorder.bounds.size.width / image.size.width; CGFloat scaleY = cell.photoBorder.bounds.size.height / image.size.height; CGFloat scale = MAX(scaleX, scaleY); cell.photo.frame = CGRectMake(0, 0, image.size.width * scale, image.size.height * scale); cell.photo.image = image; } failure:nil]; 

我必须等待所有的图像加载和重新加载UITableView移动到正确的单元格上看到正确的图像(这是因为图像caching,加载速度更快)。

而是使用cell.photo.framecell.photo.image我需要通过阻止indexPath.row得到正确的单元格。

我可以添加一个新的方法到UIImageView + WebCache:

 - (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder success:(void (^)(UIImage *image, NSInteger row))success failure:(void (^)(NSError *error))failure; { [self setImageWithURL:url placeholderImage:placeholder options:0 success:success failure:failure]; } 

但如果我这样做,我在这里得到一个错误:

 [self setImageWithURL:url placeholderImage:placeholder options:0 success:success failure:failure]; 

因为现在成功不是types(void (^)(UIImage *image))

你知道我该如何解决这个问题?

Afaik,最简单的方法是根据图像的大小和你想要的图像来手动计算imageView的帧。

使用您当前为imageView指定的框架创build一个视图,使imageView成为其子视图。 设置view.clipsToBounds = YES

然后当你分配一个图像,做一些像

 CGFloat scaleX = view.bounds.size.width / image.size.width; CGFloat scaleY = view.bounds.size.height / image.size.height; CGFloat scale = MAX(scaleX, scaleY); imageView.frame = CGRectMake(0, 0, image.size.width * scale, image.size.height * scale); imageView.image = image; 

有没有内置的方式来做到这一点,但你可以手动做到这一点:

 UIGraphicsBeginImageContext(CGSizeMake(desiredWidth, desiredHeight)); [originalImage drawAtPoint...]; ... UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();