【问题标题】:Scaling Image To Fit Certain Dimensions and Keep Aspect Ratio SwiftUI缩放图像以适应某些尺寸并保持纵横比 SwiftUI
【发布时间】:2021-01-20 05:14:37
【问题描述】:
我知道不可能在帧为 120 和 430 的图像上使用 .scaledToFit() 修饰符,并使用像 .frame(height: 100, width: 100) 这样的帧修饰符,并期望图像以某种方式保持纵横比并适合宽100,高100。
因此,解决此问题的唯一方法似乎是强制用户在使用图片选择器上传图片时将其裁剪为正方形。这在 SwiftUI 中是否可行/我在这里遗漏了什么?
谢谢
【问题讨论】:
标签:
swiftui
uiimageview
uiimagepickercontroller
react-image-crop
uiimagepicker
【解决方案1】:
你可以使用aspectRatio(contentMode:):
Image("imageName")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(height: 100, width: 100)
【解决方案2】:
如果我正确理解您的问题,您希望将非方形图像 (120x430) 放入方形框 (100x100) 中。为此,您可以缩放图像并保留其纵横比。图像将被缩放到最大高度或宽度(取决于目标宽度和高度)。
查看这篇文章:https://www.robertpieta.com/resize-uiimage-no-stretching-swift/
这里是复制粘贴解决方案:
extension UIImage {
func scalePreservingAspectRatio(width: Int, height: Int) -> UIImage {
let widthRatio = CGFloat(width) / size.width
let heightRatio = CGFloat(height) / size.height
let scaleFactor = min(widthRatio, heightRatio)
let scaledImageSize = CGSize(
width: size.width * scaleFactor,
height: size.height * scaleFactor
)
let format = UIGraphicsImageRendererFormat()
format.scale = 1
let renderer = UIGraphicsImageRenderer(
size: scaledImageSize,
format: format
)
let scaledImage = renderer.image { _ in
self.draw(in: CGRect(
origin: .zero,
size: scaledImageSize
))
}
return scaledImage
}
}