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:@""]]];
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?

  • How can I capture an image from iOS camera without user interaction?
  • Creating a UIImage from a UIColor to use as a background image for UIButton
  • How to set Minimum time to appear as default in UIDatepicker everytime
  • What's the difference between the RootViewController, AppDelegate and the View Controller classes that I may create?
  • What is the right way to create scrollable table in SKSpriteKit?
  • Sort NSDictionary in ascending order
  • 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;


    @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;
                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:
        CGRect thumbnailRect = CGRectZero;
        thumbnailRect.origin = thumbnailPoint;
        thumbnailRect.size.width  = scaledWidth;
        thumbnailRect.size.height = scaledHeight;
        [sourceImage drawInRect:thumbnailRect];
        newImage = UIGraphicsGetImageFromCurrentImageContext();
        if(newImage == nil) NSLog(@"could not scale image");
        return newImage ;
    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;
        frame.size.height = kMaxImageViewSize.height;
        frame.size.width = frame.size.height * aspectRatio;
    imageView.frame = frame;
    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@""]]];
    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;


    #import <Foundation/Foundation.h>
    @interface UIImageView (Scale)
    -(void) scaleAspectFit:(CGFloat) scaleFactor;


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

    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
        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()
        return scaledImage

    I think you can do something like = [[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];