UIImageView,setClipsToBounds和我的图像是如何失去理智
我正在开发一个iOS 4应用程序。
我在UITableViewCell
的UIImageView
上使用这个代码:
cell.photo.contentMode = UIViewContentModeScaleAspectFill; [cell.photo setClipsToBounds:YES];
我的图像比宽度更高,当我设置UIViewContentModeScaleAspectFill
,图像缩放以适应UIImageView宽度的宽度。 这样做,图像变得更大,UIImageView和我看到它在UIImageView
之外。
然后,我需要使用setClipsToBounds:YES
来不允许这样做,但现在我的所有图像都失去了setClipsToBounds:YES
。
有什么办法使用UIViewContentModeScaleAspectFill和中心左上angular的图像与左上angular的UIImageView
angular? 如果我需要失去一部分形象,我宁愿失去它的头。
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.frame
和cell.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();