iPhone:在AspectFt之后获取图像的大小

时间:2011-07-28 09:37:11

标签: iphone uiimageview

真正的奇怪的一个被卡住但奇怪的是我。

您有imageView包含图片。您缩小imageView的大小,然后告诉它使用UIViewContentModeScaleAspectFit。所以你的imageView可能是300乘200但你的缩放图像可能是300乘118或228乘200,因为它aspectfit

你到底如何得到实际图像的大小?
imageView.image.size是原始图片的大小 imageview.frameimageview未包含图片的框架 imageview.contentstretch不起作用

3 个答案:

答案 0 :(得分:36)

我在UIImageView上编写了一个快速类别来实现:

(H)

@interface UIImageView (additions)
- (CGSize)imageScale;
@end

(M)

@implementation UIImageView (additions)
- (CGSize)imageScale {
    CGFloat sx = self.frame.size.width / self.image.size.width;
    CGFloat sy = self.frame.size.height / self.image.size.height;
    CGFloat s = 1.0;
    switch (self.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);
    }
}
@end

将原始图像尺寸乘以给定比例,您将获得实际显示的图像尺寸。

答案 1 :(得分:11)

好吧..你必须做一些数学。你有原始图像的大小,你有图像视图的大小..所以你可以计算它是否将按高度或宽度调整大小。

如果图像视图为300x200且图像为1024x768,则可以计算出哪个是限制因素

300/1024 = 0.29296875
200/768 = 0.260416667

因此高度是限制因素......图像将是:

267x200

答案 2 :(得分:4)

在Individual11代码上添加一点安全性。 在没有实际图像的imageView上调用imageScale会崩溃。

extension UIImageView {
    var imageScale: CGSize {

        if let image = self.image {
            let sx = Double(self.frame.size.width / image.size.width)
            let sy = Double(self.frame.size.height / image.size.height)
            var s = 1.0
            switch (self.contentMode) {
            case .scaleAspectFit:
                s = fmin(sx, sy)
                return CGSize (width: s, height: s)

            case .scaleAspectFill:
                s = fmax(sx, sy)
                return CGSize(width:s, height:s)

            case .scaleToFill:
                return CGSize(width:sx, height:sy)

            default:
                return CGSize(width:s, height:s)
            }
        }

        return CGSize.zero
    }
}