UIImageView aspect ajustement et centre

J'ai une vue d'image, déclarée par programme, et je règle son image, aussi par programme.

Cependant, je me trouve incapable de régler l'image à la fois l'ajustement de l'aspect et aligner le centre à la vue de l'image.

En d'autres termes, je veux que l'image:

  • Réduire pour adapter l'aspect, si l'image est grande.
  • Centre mais pas à l'échelle, si l'image est petite.

Comment je reçois ça?

Juste coller la solution:

Tout comme @manohar a dit

imageView.contentMode = UIViewContentModeCenter; if (imageView.bounds.size.width > ((UIImage*)imagesArray[i]).size.width && imageView.bounds.size.height > ((UIImage*)imagesArray[i]).size.height) { imageView.contentMode = UIViewContentModeScaleAspectFit; } 

résolu mon problème

En langage rapide, nous pouvons définir le mode de contenu de la vue UIImage comme suit:

 let newImgThumb = UIImageView(frame: CGRect(x: 10, y: 10, width: 100, height: 100)) newImgThumb.contentMode = .scaleAspectFit 
 [your_imageview setContentMode:UIViewContentModeCenter]; 

Définir le contentMode de imageView à UIViewContentModeScaleAspectFit était suffisant pour moi. Il semble centrer les images aussi. Je ne sais pas pourquoi les autres utilisent une logique basée sur l'image. Voir aussi cette question: iOS aspect fit et centre

J'ai résolu ce problème comme ça.

  1. setImage à UIImageView (avec UIViewContentModeScaleAspectFit )
  2. get imageSize (CGSize imageSize = imageView.image.size)
  3. UIImageView resize. [imageView sizeThatFits:imageSize]
  4. déplacez la position où vous voulez.

Je voulais que UIView soit placé au centre de UICollectionViewCell . donc, j'ai utilisé cette fonction.

 - (void)setImageToCenter:(UIImageView *)imageView { CGSize imageSize = imageView.image.size; [imageView sizeThatFits:imageSize]; CGPoint imageViewCenter = imageView.center; imageViewCenter.x = CGRectGetMidX(self.contentView.frame); [imageView setCenter:imageViewCenter]; } 

Ça marche pour moi.

Vous pouvez y parvenir en définissant le mode contenu de l'affichage de l'image sur UIViewContentModeScaleAspectFill.

Ensuite, utilisez la méthode method suivante pour get l'object uiimage redimensionné.

 - (UIImage*)setProfileImage:(UIImage *)imageToResize onImageView:(UIImageView *)imageView { CGFloat width = imageToResize.size.width; CGFloat height = imageToResize.size.height; float scaleFactor; if(width > height) { scaleFactor = imageView.frame.size.height / height; } else { scaleFactor = imageView.frame.size.width / width; } UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), NO, 0.0); [imageToResize drawInRect:CGRectMake(0, 0, width * scaleFactor, height * scaleFactor)]; UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return resizedImage; } 

Edité ici (Version rapide)

 func setProfileImage(imageToResize: UIImage, onImageView: UIImageView) -> UIImage { let width = imageToResize.size.width let height = imageToResize.size.height var scaleFactor: CGFloat if(width > height) { scaleFactor = onImageView.frame.size.height / height; } else { scaleFactor = onImageView.frame.size.width / width; } UIGraphicsBeginImageContextWithOptions(CGSizeMake(width * scaleFactor, height * scaleFactor), false, 0.0) imageToResize.drawInRect(CGRectMake(0, 0, width * scaleFactor, height * scaleFactor)) let resizedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return resizedImage; } 

Cette sous-class utilise le centre si l'image n'est pas plus grande que la vue, sinon elle est réduite. J'ai trouvé cela utile pour un UIImageView qui change la taille.

L'image affichée est plus petite que la vue pour les grandes tailles, mais plus grande que la vue pour les petites tailles. Je le veux seulement pour réduire, mais pas vers le haut.

 class CenterScaleToFitImageView: UIImageView { override var bounds: CGRect { didSet { adjustContentMode() } } override var image: UIImage? { didSet { adjustContentMode() } } func adjustContentMode() { guard let image = image else { return } if image.size.width > bounds.size.width || image.size.height > bounds.size.height { contentMode = .ScaleAspectFit } else { contentMode = .Center } } } 
 let bannerImageView = UIImageView(); bannerImageView.contentMode = .ScaleAspectFit; bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);