如何使用UIImageView的内容模式UIViewContentModeScaleAspectFit保持高度不变,从而避免丢失图像质量?

时间:2016-12-20 05:58:07

标签: ios uiimageview uicollectionview

我在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属性。

Images

对此有任何帮助将不胜感激。我需要保留图像,因为它们保持collectionviewitem的高度固定且可变宽度。

1 个答案:

答案 0 :(得分:0)

如果我理解正确的话。您只需要找到图像的宽高比,然后乘以所需的高度。

示例:

图像

宽度= 30,身高= 10


细胞

width = ?, height = 7

比率= 30/10

单元宽度= 7 *(30/10)= 21

细胞大小将变为(21,7)


希望这就是你的意思。但如果图像小于单元格,您将面临问题。然后它可能会变形。