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.
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.
Swift version de votre code:
imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight, .flexibleBottomMargin, .flexibleRightMargin, .flexibleLeftMargin, .flexibleTopMargin]
imageView.contentMode = .scaleAspectFit // OR .scaleAspectFill
imageView.clipsToBounds = true
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é
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.
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)
}
}