Reputation: 4271
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?
Upvotes: 72
Views: 76983
Reputation: 118781
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.
Upvotes: 142
Reputation: 857
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;
}
Upvotes: 4
Reputation: 51
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
Upvotes: 0
Reputation: 41
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.
Upvotes: 1
Reputation: 1202
How to use original size of image - without any stretching
scale to fill
to Aspect Fit
within the interface builder.Upvotes: 2
Reputation: 121
Setting clipsToBounds in combination with UIViewContentModeScaleAspectFit contentMode was what did the trick for me. Hope that helps someone!
imageView.clipsToBounds = YES;
imageView.contentMode = UIViewContentModeScaleAspectFit;
Upvotes: 12
Reputation: 4910
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.
Upvotes: 4
Reputation: 94854
Use the contentMode
property. You probably want either UIViewContentModeScaleAspectFit
or UIViewContentModeCenter
.
Upvotes: 6
Reputation: 5291
Change the contentMode, e.g.:
imageView.contentMode = UIViewContentModeScaleAspectFit;
Upvotes: 2