如何在 uimageview 中获取 uiimage 的纵横比大小?

How do you get the aspect fit size of a uiimage in a uimageview?

当调用 print(uiimage.size) 时,它只给出原始图像在放大或缩小之前的宽度和高度。有没有办法获取纵横比拟合图像的尺寸?

您将需要在 Point 中自己计算生成的图像大小*。

* It turns out you don't. See . I'm going to leave this answer here to explain what the library function is doing.

数学计算如下:

let imageAspectRatio = image.size.width / image.size.height
let viewAspectRatio = imageView.frame.width / imageView.frame.height

var fitWidth:  CGFloat   // scaled width in points
var fitHeight: CGFloat   // scaled height in points
var offsetX:   CGFloat   // horizontal gap between image and frame
var offsetY:   CGFloat   // vertical gap between image and frame

if imageAspectRatio <= viewAspectRatio {
    // Image is narrower than view so with aspectFit, it will touch
    // the top and bottom of the view, but not the sides
    fitHeight = imageView.frame.height
    fitWidth = fitHeight * imageAspectRatio
    offsetY = 0
    offsetX = (imageView.frame.width - fitWidth) / 2
} else {
    // Image is wider than view so with aspectFit, it will touch
    // the sides of the view but not the top and bottom
    fitWidth = imageView.frame.width
    fitHeight = fitWidth / imageAspectRatio
    offsetX = 0
    offsetY = (imageView.frame.height - fitHeight) / 2
}

解释:

有助于画图。画一个长方形代表 图像视图。然后绘制一个窄但从 图像视图的顶部到底部。那是第一种情况。然后画 一个图像很短但延伸到图像的两侧 看法。那是第二种情况。那时,我们知道其中一个 方面。另一个只是该值乘以或除以 图片的纵横比,因为我们知道 .aspectFit 保持 图片的原始纵横比。

关于 framebounds 的说明。 frame 在视图的父视图的坐标系中。 bounds 在视图本身的坐标系中。我选择在此示例中使用框架,因为 OP 对将 imageView 在其超级视图的坐标中移动多远感兴趣。对于没有进一步旋转或缩放的标准 imageView,框架的宽度和高度将与边界的宽度和高度匹配。当旋转应用于 imageView 时,事情会变得有趣。框架展开以显示整个 imageView,但边界保持不变。

其实AVFoundation里面有一个函数可以帮你计算这个:

import AVFoundation

let fitRect = AVMakeRect(aspectRatio: image.size, insideRect: imageView.bounds)

现在fitRect.size是保持原始宽高比的imageView边界内的尺寸。