使用drawInRect时的UIImage宽高比填充问题?

5

我尝试绘制与内容模式相似的scaleAspectFill。

我找到了使用AVFoundation制作scaleAspectFit的方法,但我找不到scaleAspectFill。

如果我画一个水平图像,我不知道x值。

image.draw(in: CGRect(origin: CGPoint.init(x: ?, y: 0), size: CGSize(width: displayWidth*(image.size.width/image.size.height), height: displayWidth)))
1个回答

24
假设你有一个名为 image 的图片,并且你想将它绘制在一个矩形 targetRect 内,使其填充整个矩形而不会被拉伸变形,你可以使用以下代码:
let aspect = image.size.width / image.size.height
let rect: CGRect
if targetRect.size.width / aspect > targetRect.size.height {
    let height = targetRect.size.width / aspect
    rect = CGRect(x: 0, y: (targetRect.size.height - height) / 2,
                  width: targetRect.size.width, height: height)
} else {
    let width = targetRect.size.height * aspect
    rect = CGRect(x: (targetRect.size.width - width) / 2, y: 0,
                  width: width, height: targetRect.size.height)
}
image.draw(in: rect)

注意:这不会剪裁图像,因此它会绘制在目标矩形的边缘之外。如果您想要剪裁图像,请在绘制之前调用CGContextClipToRect(context, rect)

还要注意,与UIGraphics相比,核心图形的垂直轴是翻转的,零点从左下角开始而不是左上角,因此您可能需要相应地翻转矩形和剪切矩形。


1
你真是个救命恩人!! - bhakti123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接