web-dev-qa-db-fra.com

Swift UIImageView Aspect étiré

UIImageView ne rend pas correctement la taille d'une image. En utilisant Ajustement de l'aspect de l'échelle, si UIImageView est un carré, l'image est le rapport d'aspect correct avec une transparence dans les zones que l'image ne remplit pas.

//Image is Square & Correct Size
var imageView = UIImageView(frame: CGRectMake(0, 50, 320, 320))
imageView.clipsToBounds = true
imageView.contentMode = UIViewContentMode.ScaleAspectFit

//Image is Rectangle & Incorrect Size
var imageView = UIImageView(frame: CGRectMake(0, 50, 320, 450))
imageView.clipsToBounds = true
imageView.contentMode = UIViewContentMode.ScaleAspectFit

L'UIImageView doit toucher les bords et avoir un espace transparent en haut et en bas de l'écran et l'image à l'intérieur doit conserver son rapport d'origine plutôt que de s'étirer plus haut. J'ai joint deux images de la façon dont l'image à l'intérieur de l'UIImageView est rendue.

ImageView with correct AspectImageView with wrong Aspect

24
George Grover

J'ai ajouté un masque de redimensionnement automatique à l'UIImageView et il affiche maintenant les bons ratios.

imageView.autoresizingMask = UIViewAutoresizing.FlexibleBottomMargin | UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleRightMargin | UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleTopMargin | UIViewAutoresizing.FlexibleWidth
imageView.contentMode = UIViewContentMode.ScaleAspectFit

Cette réponse m'a aidé: la photo capturée est étirée avec AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto car j'utilisais une image prise à travers la caméra du téléphone.

39
George Grover

Swift version de votre code:

imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleBottomMargin, .flexibleRightMargin, .flexibleLeftMargin, .flexibleTopMargin]
imageView.contentMode = .scaleAspectFit // OR .scaleAspectFill
imageView.clipsToBounds = true
18
xscoder

J'avais le même problème, et ce qui l'a résolu pour moi, c'était de définir l'image imageView après avoir défini le mode de contenu. c'est à dire:

    self.imageView.contentMode = UIViewContentMode.ScaleAspectFit
    self.imageView.image = imageChosen

À votre santé

17
Paul G

C'est le comportement prévu pour UIViewContentMode.ScaleAspectFit. De la documentation:

UIViewContentModeScaleAspectFit

La possibilité de mettre le contenu à l'échelle pour l'adapter à la taille de la vue en conservant le rapport hauteur/largeur. Toute zone restante des limites de la vue est transparente.

Il semble d'après ce que vous décrivez que vous avez besoin de UIViewContentMode.ScaleAspectFill

UIViewContentModeScaleAspectFill

L'option de redimensionner le contenu pour remplir la taille de la vue. Une partie du contenu peut être tronquée pour remplir les limites de la vue.

6
Cezar

Il existe une excellente solution ici: par olearyj234 .
et cela m'a beaucoup aidé. Je suggère de jeter un œil. En outre, voici son code dans Swift 4 et Xcode 9.2:

    class ScaledHeightImageView: UIImageView {

    override var intrinsicContentSize: CGSize {

        if let myImage = self.image {
            let myImageWidth = myImage.size.width
            let myImageHeight = myImage.size.height
            let myViewWidth = self.frame.size.width

            let ratio = myViewWidth/myImageWidth
            let scaledHeight = myImageHeight * ratio

            return CGSize(width: myViewWidth, height: scaledHeight)
        }

        return CGSize(width: -1.0, height: -1.0)
    }

}
1
Hamid Hoseini