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

Bur*_*000 25 iphone uiimageview

真的很奇怪的一个被卡住但奇怪的是我.

你有一个imageView包含图像.你缩小尺寸,imageView然后告诉它使用UIViewContentModeScaleAspectFit.所以你imageView可能是300乘200但你的缩放图像可能是300乘118或228乘200因为它aspectfit.

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

Cyr*_*lle 36

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

(.H)

@interface UIImageView (additions)
- (CGSize)imageScale;
@end
Run Code Online (Sandbox Code Playgroud)

(.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
Run Code Online (Sandbox Code Playgroud)

将原始图像大小乘以给定比例,您将获得实际显示的图像大小.

  • 我对你在UIImageView中获取图像的实际CGRect的方法感兴趣. (8认同)
  • 警告,如果未设置图像,此代码将中断.添加行`if(self.image == nil)返回CGSizeMake(1,1);`作为`imageScale`实现的第一行. (2认同)

Bas*_*ian 11

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

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

300/1024 = 0.29296875
200/768 = 0.260416667
Run Code Online (Sandbox Code Playgroud)

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

267x200


Ind*_*l11 6

接受答案的Swift版本:

extension UIImageView {
var imageScale: CGSize {
    let sx = Double(self.frame.size.width / self.image!.size.width)
    let sy = Double(self.frame.size.height / self.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)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)