How to stop an image from stretching within a UIImageView?

74,530

Solution 1

You can use

self.imageView.contentMode = UIViewContentModeScaleAspectFit;

Swift 3:

imageView.contentMode = .scaleAspectFit

Or UIViewContentModeCenter / .center, or any of the other modes described in the UIView documentation.

Solution 2

Setting clipsToBounds in combination with UIViewContentModeScaleAspectFit contentMode was what did the trick for me. Hope that helps someone!

imageView.clipsToBounds = YES;
imageView.contentMode = UIViewContentModeScaleAspectFit;

Solution 3

Use the contentMode property. You probably want either UIViewContentModeScaleAspectFit or UIViewContentModeCenter.

Solution 4

Change the UIImage's Mode from 'scale to fill' to 'Center' within the interface builder. Make sure your image is the exact size you need.

enter image description here

Solution 5

You have to set CGSize as your image width and hight so image will not stretch and it will arrange at the middle of imageview.

- (UIImage *)imageWithImage:(UIImage *)image scaledToFillSize:(CGSize)size
{
    CGFloat scale = MAX(size.width/image.size.width, size.height/image.size.height);
    CGFloat width = image.size.width * scale;
    CGFloat height = image.size.height * scale;
    CGRect imageRect = CGRectMake((size.width - width)/2.0f,
                                  (size.height - height)/2.0f,
                                  width,
                                  height);

    UIGraphicsBeginImageContextWithOptions(size, NO, 0);
    [image drawInRect:imageRect];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}
Share:
74,530
R. Dewi
Author by

R. Dewi

Updated on May 18, 2020

Comments

  • R. Dewi
    R. Dewi about 4 years

    I have a UIImageView where I have set the frame size to x = 0, y = 0, width = 404, height = 712. In my project, I need to change the image in UIImageView dynamically.

    I am using this code to change the image:

    self.imageView.image = [UIImage imageNamed:@"setting-image.png"];
    

    The problem is, when the *.png image size is smaller than the UIImageView frame size, the image stretches. I don't want it to stretch. Is there any way to do that?

  • R. Dewi
    R. Dewi almost 13 years
    thank you for your answer, but using mode aspect fit make some image's position too below, so i change it into top left mode, thank you for suggesting me to using it, finally, i've got the answer :)
  • Achintya Ashok
    Achintya Ashok almost 7 years
    "clipsToBounds" checkmarked & "contentMode" as "AspectFill" on the Storyboard worked for me in Xcode 8