UIImageView Ajustement et centre de l'aspect


183

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

Cependant, je me trouve incapable de régler l'image pour qu'elle s'adapte à la fois à l'aspect et à l'alignement du centre sur la vue de l'image.

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

  • Réduisez la taille pour l'adapter à l'aspect, si l'image est grande.
  • Centrer mais pas agrandir, si l'image est petite.

Comment puis-je l'obtenir?


19
[yourImageView setContentMode: UIViewContentModeCenter]; et assurez-vous que le cadre imageView est supérieur au cadre d'image. si ce n'est pas le cas, placez [yourImageView setContentMode: UIViewContentModeAspectToFit];
Manohar Perepa

1
if else condition dude @RyanPoolos
Manohar Perepa

Réponses:


205

Juste coller la solution:

Tout comme @manohar l'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;
}

a résolu mon problème


7
Le moyen le plus court de découvrir l'image est plus petit:CGRectContainsRect(imageView.bounds, {CGPointZero, image.size})
Cfr

@Cfr c'est peut-être plus court, mais pas si lisible. En même temps , je vous propose de diviser la ligne avec l' instruction if comme ceci: CGSize imageSize = ((UIImage*)imagesArray[i]).size;, CGSize viewSize = imageView.bounds.size, if (viewSize.width > imageSize.width && viewSize.height > imageSize.height) {.
Timur Bernikovich

1
Devrait être UIViewContentModeScaleAspectFit
NoelHunter

imageView.contentMode = UIViewContentModeScaleAspectFit;
Arjay Waran

75

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

3
Cela fait exploser l'image si elle est plus petite que la vue de l'image, contrairement à ce que l'OP demandait.
fishinear le

18

Rapide

yourImageView.contentMode = .center

Vous pouvez utiliser les options suivantes pour positionner votre image:

  • scaleToFill
  • scaleAspectFit // contenu mis à l'échelle pour s'adapter à un aspect fixe. le reste est transparent
  • redraw // redessiner lors du changement de limites (appelle -setNeedsDisplay)
  • center// le contenu reste de la même taille. positionné ajusté.
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight

12

Réponse mise à jour

Lorsque j'ai initialement répondu à cette question en 2014, il n'était pas nécessaire de ne pas agrandir l'image dans le cas d'une petite image. (La question a été modifiée en 2015. ) Si vous avez une telle exigence, vous devrez en effet comparer la taille de l'image à celle de l'imageView et utiliser soit UIViewContentModeCenter(dans le cas d'une image plus petite que l'imageView) soit UIViewContentModeScaleAspectFitdans tous les autres cas .

Réponse originale

Définir le contentMode de l'imageView UIViewContentModeScaleAspectFitsur me suffisait. Il semble également centrer les images. Je ne sais pas pourquoi d'autres utilisent une logique basée sur l'image. Voir aussi cette question: Ajustement et centre de l'aspect iOS


1
Cela fait exploser l'image si elle est plus petite que la vue de l'image, contrairement à ce que l'OP demandait.
fishinear le

1
@fishinear L'exigence de ne pas agrandir l'image a été ajoutée à la question un an après que j'y ai répondu: stackoverflow.com/posts/15499376/revisions
Nate Cook

10

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

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

Je voulais mettre UIView en haut 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.


8

Cette sous-classe 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 UIImageViewqui change la taille.

L'image qu'elle affiche est plus petite que la vue pour les grandes tailles, mais plus grande que la vue pour les petites tailles. Je veux qu'il soit réduit, mais pas à la hausse.

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
        }
    }
}

8

Vous pouvez y parvenir en définissant le mode de contenu de la vue image sur UIViewContentModeScaleAspectFill.

Ensuite, utilisez la méthode de la méthode suivante pour obtenir l'objet 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;
}

Modifié ici (version Swift)

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;
}

7
[your_imageview setContentMode:UIViewContentModeCenter];

17
Cela ignorera la mise à l'échelle
Skrew

2
Je ne sais pas pourquoi des solutions comme celle-ci ont obtenu autant de votes positifs. Cette personne n'a clairement pas lu la question du tout.
lent le

7
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);

Cela fait exploser l'image si elle est plus petite que la vue de l'image, contrairement à ce que l'OP demandait.
fishinear le

2

Pour les personnes à la recherche de redimensionnement UIImage,

@implementation UIImage (Resize)

- (UIImage *)scaledToSize:(CGSize)size
{
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
    [self drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

- (UIImage *)aspectFitToSize:(CGSize)size
{
    CGFloat aspect = self.size.width / self.size.height;
    if (size.width / aspect <= size.height)
    {
        return [self scaledToSize:CGSizeMake(size.width, size.width / aspect)];
    } else {
        return [self scaledToSize:CGSizeMake(size.height * aspect, size.height)];
    }
}

- (UIImage *)aspectFillToSize:(CGSize)size
{
    CGFloat imgAspect = self.size.width / self.size.height;
    CGFloat sizeAspect = size.width/size.height;

    CGSize scaledSize;

        if (sizeAspect > imgAspect) { // increase width, crop height
            scaledSize = CGSizeMake(size.width, size.width / imgAspect);
        } else { // increase height, crop width
            scaledSize = CGSizeMake(size.height * imgAspect, size.height);
        }
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClipToRect(context, CGRectMake(0, 0, size.width, size.height));
    [self drawInRect:CGRectMake(0.0f, 0.0f, scaledSize.width, scaledSize.height)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

@end
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.