我在collectionview
内使用tableview
来显示异步下载的图像。我需要做的是在不挤压的情况下显示这些图像。我保持collectionview
的高度不变,并计算图像'下载后的尺寸。我保持UIIamgeView
UIViewContentModeScaleAspectFit的内容模式。这就是我为实现预期结果所做的工作。
- (void)configureMediaCell:(MediaContainerViewCell *)weakCell withMediaItem:(MSZWallPostMedia *)mediaItem withDownloadImage:(UIImage *)image{
if (mediaItem.isFrameSet == NO) {
weakCell.isFrameSet = YES;
weakCell.cellImageView.image = image;
weakCell.cellImageView.contentMode = UIViewContentModeScaleAspectFit;
CGRect frame = weakCell.cellImageView.frame;
//Image Scaling
CGSize scaleSize = [self imageScale:weakCell.cellImageView];
scaleSize.width = scaleSize.width * image.size.width;
scaleSize.height = scaleSize.height * image.size.height;
frame.size.width = scaleSize.width;
frame.size.height = scaleSize.height;
weakCell.cellImageView.frame = frame;
mediaItem.frame = frame;
mediaItem.isFrameSet = YES;
[weakCell.activityIndicatorView stopAnimating];
[self.collectionView reloadItemsAtIndexPaths:@[weakCell.indexPath]];
} else {
[weakCell.activityIndicatorView stopAnimating];
weakCell.cellImageView.image = image;
weakCell.cellImageView.frame = mediaItem.frame;
weakCell.cellImageView.contentMode = UIViewContentModeScaleAspectFit;
}
}
对于图像缩放:
- (CGSize)imageScale : (UIImageView *)imageView {
CGFloat sx = imageView.frame.size.width / imageView.image.size.width;
CGFloat sy = imageView.frame.size.height / imageView.image.size.height;
CGFloat s = 1.0;
switch (imageView.contentMode) {
case UIViewContentModeScaleAspectFit:
s = fminf(sx, sy);
return CGSizeMake(s, s);
break;
case UIViewContentModeScaleAspectFill:
s = fmaxf(sx, sy);
return CGSizeMake(s, s);
break;
case UIViewContentModeScaleToFill:
return CGSizeMake(sx, sy);
default:
return CGSizeMake(s, s);
}
}
这种方法的问题在于我获得了正确的宽度和高度,但是一些图像显示得更小,这是显而易见的,因为我使用了附加屏幕中显示的imageview的Aspectfit
属性。
对此有任何帮助将不胜感激。我需要保留图像,因为它们保持collectionviewitem
的高度固定且可变宽度。
答案 0 :(得分:0)
如果我理解正确的话。您只需要找到图像的宽高比,然后乘以所需的高度。
示例:强>
图像
宽度= 30,身高= 10
细胞
width = ?, height = 7
比率= 30/10
单元宽度= 7 *(30/10)= 21
细胞大小将变为(21,7)
希望这就是你的意思。但如果图像小于单元格,您将面临问题。然后它可能会变形。