web-dev-qa-db-fra.com

UIImageView aspect ajustement et centre

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

Cependant, je me trouve incapable de régler l'image pour qu'elle corresponde à l'aspect et aligne le centre sur la vue de l'image.

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

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

Comment puis-je l'obtenir?

164
Ravi Vooda

Il suffit de 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

191
Ravi Vooda

Dans la langue Swift, 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
67
Ali Raza

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 était édité 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 de une image plus petite que l'imageView) ou UIViewContentModeScaleAspectFit dans tous les autres cas.

Réponse originale

Régler le contentMode de l'imageView sur UIViewContentModeScaleAspectFit me suffisait. Cela semble également centrer les images. Je ne suis pas sûr de savoir pourquoi d'autres utilisent une logique basée sur l'image. Voir aussi cette question: aspect et ajustement iOS

12
Nate Cook

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

  1. définir Image sur UIImageView (avec UIViewContentModeScaleAspectFit)
  2. obtenir imageSize (CGSize imageSize = imageView.image.size)
  3. UIImageView redimensionner. [imageView sizeThatFits:imageSize]
  4. déplacez la position où vous voulez.

Je voulais mettre UIView en haut au centre de UICollectionViewCell. alors, 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.

10
Nicejinux

Cette sous-classe utilise center 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 veux seulement que cela diminue, mais pas plus 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
        }
    }
}
8
orkoden

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

Ensuite, utilisez 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;
}

Edité 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;
}
8
Manish

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 à la modification des limites (appelle -setNeedsDisplay)
  • center // le contenu reste de la même taille. positionné ajusté.
  • top
  • bottom
  • left
  • right
  • topLeft
  • topRight
  • bottomLeft
  • bottomRight
8
Jonas Deichelmann
let bannerImageView = UIImageView();
bannerImageView.contentMode = .ScaleAspectFit;
bannerImageView.frame = CGRectMake(cftX, cftY, ViewWidth, scrollHeight);
7
Antony Ouseph
[your_imageview setContentMode:UIViewContentModeCenter];
5
souvickcse

Pour les personnes recherchant le 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
1
karim