缩放图像以适应特定尺寸并保持纵横比 SwiftUI

Eva*_*van 8 uiimageview uiimagepickercontroller swiftui uiimagepicker react-image-crop

我知道不可能.scaledToFit()在帧为 120 和 430 的图像上使用修改器,使用像这样的帧修改器.frame(height: 100, width: 100)并期望图像以某种方式保持宽高比并适合宽度 100 和高度 100 的帧。

因此,解决这个问题的唯一方法似乎是强制用户在使用图像选择器上传图像时将其图像裁剪成正方形。这在 SwiftUI 中可能吗/我在这里缺少什么吗?

谢谢

paw*_*222 7

您可以使用aspectRatio(contentMode:)

Image("imageName")
    .resizable()
    .aspectRatio(contentMode: .fit)
    .frame(width: 100, height: 100)
Run Code Online (Sandbox Code Playgroud)


Mak*_*zyk 3

如果我正确理解你的问题,你想将非方形图像(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
  }
}
Run Code Online (Sandbox Code Playgroud)