How to scale a UIImageView proportionally?

I have a UIImageView and the objective is to scale it down proportionally by giving it either a height or width.

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://img.ioscake.com/objective-c/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;

The image did get resized but the position is not at the top left. What is the best approach to scaling image/imageView and how do I correct the position?

  • iOS: call obj-c methods using javascript in a UIWebview
  • Using Predicate in Swift
  • Encryption for Objective-C
  • Calling method in current view controller from App Delegate in iOS
  • Force controllers to Change their orientation in Either Portrait or Landscape
  • iOS framework with dependencies
  • 17 Solutions Collect From Internet About “How to scale a UIImageView proportionally?”

    Fixed easily, once I found the documentation!

     imageView.contentMode = UIViewContentModeScaleAspectFit;
    

    I’ve seen a bit of conversation about scale types so I decided to put together an article regarding some of the most popular content mode scaling types.

    The associated image is here:

    enter image description here

    I just tried this, and UIImage does not support _imageScaledToSize.

    I ended up adding a method to UIImage using a category – a suggestion I found on the Apple Dev forums.

    In a project-wide .h –

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

    Implementation:

    @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;
    
    imageView.contentMode = UIViewContentModeScaleAspectFill;
    imageView.clipsToBounds = YES;
    

    You could try making the imageView size match the image. The following code is not tested.

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

    The original code posted at the top worked well for me in iOS 4.2.

    I found that creating a CGRect and specifying all the top, left, width, and height values was the easiest way to adjust the position in my case, which was using a UIImageView inside a table cell. (Still need to add code to release objects)

    one can resize an UIImage this way

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

    Set your ImageView by selecting Mode to Aspect Fill and check the Clip Subviews box.

    enter image description here

    For Swift :

    self.imageViews.contentMode = UIViewContentMode.ScaleToFill
    

    This works fine for me Swift 2.x:

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

    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
    

    Set your UIimageview by scale………

    enter image description here

    I used following code.where imageCoverView is UIView holds 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;
    }
    

    If the solutions proposed here aren’t working for you, and your image asset is actually a PDF, note that XCode actually treats PDFs differently than image files. In particular, it doesn’t seem able to scale to fill properly with a PDF: it ends up tiled instead. This drove me crazy until I figured out that the issue was the PDF format. Convert to JPG and you should be good to go.

    Usually I use this method for my apps (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
    }
    

    I think you can do something like

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

    Here is how you can scale it easily.

    This works in 2.x with the Simulator and the iPhone.

    UIImage *thumbnail = [originalImage _imageScaledToSize:CGSizeMake(40.0, 40.0) interpolationQuality:1];