web-dev-qa-db-fra.com

Comment redimensionner un UIImageView proportionnellement?

J'ai un UIImageView et l'objectif est de le réduire proportionnellement en lui donnant une hauteur ou une largeur.

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 

//Add image view
[self.view addSubview:imageView];   

//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;

//change width of frame
CGRect frame = imageView.frame;
frame.size.width = 100;
imageView.frame = frame;

L'image a été redimensionnée mais la position n'est pas en haut à gauche. Quelle est la meilleure approche pour redimensionner image/imageView et comment corriger la position?

338
Ronnie Liew

Fixé facilement, une fois que j'ai trouvé la documentation!

 imageView.contentMode = UIViewContentModeScaleAspectFit;
539
Ken Abrams

J'ai assisté à quelques conversations sur les types d'échelle, j'ai donc décidé de créer un article sur certains des types d'échelle les plus populaires en mode conten .

L'image associée est ici:

enter image description here

397
Jacksonkr

Je viens d'essayer cela, et UIImage ne supporte pas _imageScaledToSize.

J'ai fini par ajouter une méthode à UIImage en utilisant une catégorie - une suggestion trouvée sur les forums Apple Dev.

Dans un projet .h -

@interface UIImage (Extras)
- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
@end;

La mise en oeuvre:

@implementation UIImage (Extras)

- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize {

    UIImage *sourceImage = self;
    UIImage *newImage = nil;

    CGSize imageSize = sourceImage.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;

    CGFloat targetWidth = targetSize.width;
    CGFloat targetHeight = targetSize.height;

    CGFloat scaleFactor = 0.0;
    CGFloat scaledWidth = targetWidth;
    CGFloat scaledHeight = targetHeight;

    CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

    if (CGSizeEqualToSize(imageSize, targetSize) == NO) {

        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;

        if (widthFactor < heightFactor) 
            scaleFactor = widthFactor;
        else
            scaleFactor = heightFactor;

        scaledWidth  = width * scaleFactor;
        scaledHeight = height * scaleFactor;

        // center the image

        if (widthFactor < heightFactor) {
            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
        } else if (widthFactor > heightFactor) {
            thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
        }
    }


    // this is actually the interesting part:

    UIGraphicsBeginImageContext(targetSize);

    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.Origin = thumbnailPoint;
    thumbnailRect.size.width  = scaledWidth;
    thumbnailRect.size.height = scaledHeight;

    [sourceImage drawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    if(newImage == nil) NSLog(@"could not scale image");


    return newImage ;
}

@end;
78
Jane Sales
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.clipsToBounds = YES;
38
Li-chih Wu

Vous pouvez essayer de faire correspondre la taille imageView à la image. Le code suivant n'est pas testé.

CGSize kMaxImageViewSize = {.width = 100, .height = 100};
CGSize imageSize = image.size;
CGFloat aspectRatio = imageSize.width / imageSize.height;
CGRect frame = imageView.frame;
if (kMaxImageViewSize.width / aspectRatio <= kMaxImageViewSize.height) 
{
    frame.size.width = kMaxImageViewSize.width;
    frame.size.height = frame.size.width / aspectRatio;
} 
else 
{
    frame.size.height = kMaxImageViewSize.height;
    frame.size.width = frame.size.height * aspectRatio;
}
imageView.frame = frame;
30
Chris Lundie
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 


//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;

//change width of frame
//CGRect frame = imageView.frame;
//frame.size.width = 100;
//imageView.frame = frame;

//original lines that deal with frame commented out, yo.
imageView.frame = CGRectMake(10, 20, 60, 60);

...

//Add image view
[myView addSubview:imageView]; 

Le code original affiché en haut a bien fonctionné pour moi dans iOS 4.2.

J'ai constaté que la création d'un CGRect et la spécification de toutes les valeurs supérieure, gauche, largeur et hauteur constituaient le moyen le plus simple d'ajuster la position dans mon cas, qui utilisait UIImageView dans une cellule de tableau. (Encore besoin d'ajouter du code pour libérer des objets)

13
Nate Flink

on peut redimensionner une UIImage de cette façon

image = [UIImage imageWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];
12
neoneye

Configurez votre ImageView en sélectionnant Mode sur Aspect Fill et cochez la case Clip Subviews.

enter image description here

12
Jeffrey Neo

Cela fonctionne très bien pour moi Swift 2.x:

imageView.contentMode = .ScaleAspectFill
imageView.clipsToBounds = true;
9
vvamondes

Pour Swift:

self.imageViews.contentMode = UIViewContentMode.ScaleToFill
6
Somir Saikia

Réglez votre UIimageview par échelle .........

enter image description here

6
P.J.Radadiya

UIImageView + Scale.h:

#import <Foundation/Foundation.h>

@interface UIImageView (Scale)

-(void) scaleAspectFit:(CGFloat) scaleFactor;

@end

UIImageView + Scale.m:

#import "UIImageView+Scale.h"

@implementation UIImageView (Scale)


-(void) scaleAspectFit:(CGFloat) scaleFactor{

    self.contentScaleFactor = scaleFactor;
    self.transform = CGAffineTransformMakeScale(scaleFactor, scaleFactor);

    CGRect newRect = self.frame;
    newRect.Origin.x = 0;
    newRect.Origin.y = 0;
    self.frame = newRect;
}

@end
5
Peter Kreinz

Si les solutions proposées ici ne fonctionnent pas et si votre ressource image est en réalité un PDF, notez que XCode traite les PDF différemment des fichiers image. En particulier, il semble impossible de s’adapter pour remplir correctement avec un PDF: il finit par être affiché en mosaïque. Cela m'a rendu fou jusqu'à ce que je découvre qu'il s'agissait du format PDF. Convertissez au format JPG et vous devriez être prêt à partir.

2
Lane Rettig

J'ai utilisé le code suivant. Où imageCoverView est UIView détient UIImageView

if (image.size.height<self.imageCoverView.bounds.size.height && image.size.width<self.imageCoverView.bounds.size.width)
{
    [self.profileImageView sizeToFit];
    self.profileImageView.contentMode =UIViewContentModeCenter
}
else
{
    self.profileImageView.contentMode =UIViewContentModeScaleAspectFit;
}
2
Avijit Nagare

J'utilise généralement cette méthode pour mes applications (Swift 2.x compatible):

// Resize UIImage
func resizeImage(image:UIImage, scaleX:CGFloat,scaleY:CGFloat) ->UIImage {
    let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(scaleX, scaleY))
    let hasAlpha = true
    let scale: CGFloat = 0.0 // Automatically use scale factor of main screen

    UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
    image.drawInRect(CGRect(Origin: CGPointZero, size: size))

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return scaledImage
}
1
Alessandro Ornano

Je pense que tu peux faire quelque chose comme

image.center = [[imageView window] center];
0
user26359