首页 > 解决方案 > Swift 中的图像调整大小仅适用于某些 iPhone 型号

问题描述

我的 Storyboard 布局上有一个 ImageView,我在这个 ImageView 上放了一些图像。为了保持图像的比例,我创建了一个代码来计算图像比例。

static func getImageScale(_ myImage:UIImageView) -> (width: CGFloat, height: CGFloat)  {
    let imageViewHeight = myImage.bounds.height
    let imageViewWidth = myImage.bounds.width
    
    let imageSize = myImage.image!.size
    
    let myScaledImageHeight = imageViewHeight / imageSize.height
    let myScaledImageWidth = imageViewWidth / imageSize.width
    
    return (width: myScaledImageWidth, height: myScaledImageHeight)
}

这就是我使用上面代码的方式:

ImageMarcasHelper.addScaledImageToScreenWithoutMovement(imageStringName: nome_imagem, scaledImageWidth: percentImageScale.width, scaledImageHeigth: percentImageScale.height, view: view)

最后,我称之为:

static func addScaledImageToScreenWithoutMovement(imageStringName imageNameString:String, scaledImageWidth:CGFloat, scaledImageHeigth:CGFloat, view:UIView) {
    var xFinal = 0
    var scaledImageWidthMultiplied:CGFloat = 0.0
    
    let vc: UIViewController = view.parentViewController!
    let vc_name = type(of: vc)
    
    let image = UIImage(named: imageNameString)
    print(image!)
    let imageView = UIImageView(image: image!)
    imageView.isAccessibilityElement = true
    imageView.restorationIdentifier = imageNameString
    
    if vc_name == ResenhaMarcasCabecaController.classForCoder() ||
       vc_name == ResenhaMarcasMembrosPosterioresController.classForCoder() {
        print("ResenhaMarcasCabecaController view used")
        xFinal = Int((image?.size.width)!/1.9)
        scaledImageWidthMultiplied = (image?.size.width)! * 1
    } else {
        // identifica todas as outras views como ResenhaMarcasFocinhoController ou ResenhaMarcasPescocoController ou ResenhaMarcasMembrosAnterioresController
        print("viewcontroller genenrica usada")
        xFinal = 0
        scaledImageWidthMultiplied = (image?.size.width)! * scaledImageWidth
    }
    
    imageView.frame = CGRect(
        x: xFinal,
        y: 0,
        width:  Int( scaledImageWidthMultiplied ),
        height: Int( (image?.size.height)! * scaledImageHeigth )
    )
    view.addSubview(imageView)
}

在某些 iPhone 型号上,图像大小调整效果很好,但在其他型号上计算不正确。

检查下面来自 iPhone 8 和 iPhone 8 Plus 的图像

文本

左侧的红色图像居中,但右侧的红色图像未居中。

我该如何解决?我可以使用另一个代码来修复它,还是我需要在我的代码上进行一些调整?

或者可能是另一种解决方案,有什么方法可以检测屏幕尺寸或尺寸的类型?iPhone 11 Max 和 iPhone Max Pro 也会出现同样的问题。

红色图像以 iPhone 11 Max 为中心,但未以 iPhone Max Pro 为中心。

- - 编辑 - -

@IBOutlet weak var imagemPrincipalCabeca:UIImageView!

我有一个 IBOutlet,其中包含我使用带有 AutoLayout 的 Storyboard 创建的 ImageView,并且我使用此 ImageView 中的图像来获取适用于其他图像的比例。

这是我用来从分配给 ImageView 的 IBOutlet 获取和应用比例的代码

let percentImageScale = ImageMarcasHelper.getImageScale(imagemPrincipalCabeca)

ImageMarcasHelper.addScaledImageToScreenWithoutMovement(
imageStringName: nome_imagem, 
scaledImageWidth: percentImageScale.width, 
scaledImageHeigth: percentImageScale.height, 
view: view)

标签: swiftimage

解决方案


我找出问题所在。

所有计算都在“viewDidLoad”方法中完成。在此方法中,计算不正确,因为视图仍然不知道子视图(容器视图)的正确大小

我更改了要在“viewWillAppear”方法中进行的所有计算。通过这种方式,我能够获得子视图的正确屏幕宽度和高度。


推荐阅读