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?
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.
Setting clipsToBounds in combination with UIViewContentModeScaleAspectFit contentMode was what did the trick for me. Hope that helps someone!
imageView.clipsToBounds = YES;
imageView.contentMode = UIViewContentModeScaleAspectFit;
Use the contentMode
property. You probably want either UIViewContentModeScaleAspectFit
or UIViewContentModeCenter
.
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.
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;
}
Update for Swift 3:
imageView.contentMode = .scaleAspectFit
Change the contentMode, e.g.:
imageView.contentMode = UIViewContentModeScaleAspectFit;
How to use original size of image - without any stretching
- Just change the UIImage's Mode from
scale to fill
toAspect Fit
within the interface builder.
Use this for your UIImageView
imageView.contentMode = UIViewContentModeScaleAspectFill;
You won't get any space and with scale preserved. However, some part of the image will be clipped off.
If you use the following:
imageView.contentMode = UIViewContentModeScaleAspectFit;
There will be some empty space, but scale is preserved.
still stretch when image is bigger than imageivew
swift
let qCodeImage = UIImage(named: "qcode-placeholder.png")!
let qCodeImageView = UIImageView(frame: CGRectMake(0, 0, CGRectGetWidth(cardView.frame)-30, CGRectGetWidth(cardView.frame)-30))
qCodeImageView.image = qCodeImage
qCodeImageView.clipsToBounds = true
qCodeImageView.contentMode = UIViewContentMode.ScaleToFill
qCodeImageView.center = cardView.center
来源:https://stackoverflow.com/questions/7035523/how-to-stop-an-image-from-stretching-within-a-uiimageview