我试图像内容模式一样绘制scaleAspectFill。
我发现如何使用AVFoundation制作sacelAspectFit但我找不到scaleAspectFill。
如果我画水平图像,我不知道x值
image.draw(in: CGRect(origin: CGPoint.init(x: ?, y: 0), size: CGSize(width: displayWidth*(image.size.width/image.size.height), height: displayWidth)))
答案 0 :(得分:14)
假设您有一个名为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)
注意:这不会剪切图像,因此它会在目标rect的边缘之外绘制。如果要剪辑图像,请在绘图前调用CGContextClipToRect(context, rect)
。
另请注意,核心图形垂直轴是翻转的,与UIGraphics相比,从左下角开始而不是从左上角开始,因此您可能需要相应地翻转矩形和裁剪矩形。