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

时间:2021-01-20 05:14:37

标签: swiftui uiimageview uiimagepickercontroller react-image-crop uiimagepicker

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

因此,似乎解决此问题的唯一方法是强制用户在使用图像选择器上传图像时将其裁剪为正方形。这在 SwiftUI 中是否可行/我在这里遗漏了什么?

谢谢

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您想将非方形图像 (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
  }
}

答案 1 :(得分:0)

您可以使用aspectRatio(contentMode:)

Image("imageName")
    .resizable()
    .aspectRatio(contentMode: .fit)
    .frame(height: 100, width: 100)
相关问题