Вот мое решение без AV-основания.
Сначала вот расширение CGSize для вычисления размера, подходящего для другого размера:
extension CGSize
{
func sizeThatFitsSize(_ aSize: CGSize) -> CGSize
{
let width = min(self.width * aSize.height / self.height, aSize.width)
return CGSize(width: width, height: self.height * width / self.width)
}
}
Таким образом, решение проблемы ОП сводится к:
let resultSize = image.size.sizeThatFitsSize(imageView.bounds.size)
Также вот еще одно расширение для подгонки прямоугольника внутри другого прямоугольника (в нем используется указанное выше расширение CGSize):
extension CGRect
{
func rectThatFitsRect(_ aRect:CGRect) -> CGRect
{
let sizeThatFits = self.size.sizeThatFitsSize(aRect.size)
let xPos = (aRect.size.width - sizeThatFits.width) / 2
let yPos = (aRect.size.height - sizeThatFits.height) / 2
let ret = CGRect(x: xPos, y: yPos, width: sizeThatFits.width, height: sizeThatFits.height)
return ret
}
}