Redimensionner UIImage et changer la taille de UIImageView
j'ai ce UIImageView
et j'ai les valeurs de sa hauteur maximale et de sa largeur maximale. Ce que je veux réaliser c'est que je veux profiter de l'image (avec un aspect ratio et de toute résolution) et je veux qu'il fit dans les frontières de l'image ne pas dépasser , mais il peut rétrécir comme il veut. (marqué en rouge sur l'image):
en ce moment l'image s'adapte à la taille nécessaire correctement, mais j'ai 2 soucis:
1. Le UIImageView
n'est pas égal à la taille de l'image redimensionnée, laissant ainsi le fond rouge (et je ne veux pas que)
2. Si l'image est plus petite que la hauteur de mon UIImageView
il n'est pas redimensionnée pour être plus petit, il reste à la même hauteur.
Voici mon code et je sais que c'est faux:
UIImage *actualImage = [attachmentsArray lastObject];
UIImageView *attachmentImageNew = [[UIImageView alloc] initWithFrame:CGRectMake(5.5, 6.5, 245, 134)];
attachmentImageNew.image = actualImage;
attachmentImageNew.backgroundColor = [UIColor redColor];
attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit;
alors comment changer dynamiquement la taille non seulement du UIImageView.image
, mais de l'ensemble UIImageView
, faisant ainsi sa taille totalement réglable à son contenu. Toute aide serait très appréciée, merci!
7 réponses
lorsque vous obtenez la largeur et la hauteur d'une image redimensionnée obtenir la largeur d'une image redimensionnée après UIViewContentModeScaleAspectFit , vous pouvez redimensionner votre imageView:
imageView.frame = CGRectMake(0, 0, resizedWidth, resizedHeight);
imageView.center = imageView.superview.center;
Je n'ai pas vérifié si ça marchait, mais je pense que tout devrait aller bien
- (UIImage *)image:(UIImage*)originalImage scaledToSize:(CGSize)size
{
//avoid redundant drawing
if (CGSizeEqualToSize(originalImage.size, size))
{
return originalImage;
}
//create drawing context
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);
//draw
[originalImage drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
//capture resultant image
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//return image
return image;
}
C'est L'équivalent Swift pour la réponse de Rajneesh071, en utilisant des extensions""
UIImage {
func scaleToSize(aSize :CGSize) -> UIImage {
if (CGSizeEqualToSize(self.size, aSize)) {
return self
}
UIGraphicsBeginImageContextWithOptions(aSize, false, 0.0)
self.drawInRect(CGRectMake(0.0, 0.0, aSize.width, aSize.height))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Utilisation:
let image = UIImage(named: "Icon")
item.icon = image?.scaleToSize(CGSize(width: 30.0, height: 30.0))
utilisez la catégorie ci-dessous et appliquez bordure de Quartz dans votre image:
[yourimage.layer setBorderColor:[[UIColor whiteColor] CGColor]];
[yourimage.layer setBorderWidth:2];
la catégorie: UIImage+AutoScaleResize.h
#import <Foundation/Foundation.h>
@interface UIImage (AutoScaleResize)
- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize;
@end
UIImage+AutoScaleResize.m
#import "UIImage+AutoScaleResize.h"
@implementation UIImage (AutoScaleResize)
- (UIImage *)imageByScalingAndCroppingForSize:(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; // scale to fit height
}
else
{
scaleFactor = heightFactor; // scale to fit width
}
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;
}
}
}
UIGraphicsBeginImageContext(targetSize); // this will crop
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");
}
//pop the context to get back to the default
UIGraphicsEndImageContext();
return newImage;
}
@end
Si vous avez la taille de l'image, pourquoi ne pas vous fixer le frame.size
de l'affichage de l'image de cette taille?
EDIT - - - -
Ok, donc en voyant votre commentaire je vous propose ceci:
UIImageView *imageView;
//so let's say you're image view size is set to the maximum size you want
CGFloat maxWidth = imageView.frame.size.width;
CGFloat maxHeight = imageView.frame.size.height;
CGFloat viewRatio = maxWidth / maxHeight;
CGFloat imageRatio = image.size.height / image.size.width;
if (imageRatio > viewRatio) {
CGFloat imageViewHeight = round(maxWidth * imageRatio);
imageView.frame = CGRectMake(0, ceil((self.bounds.size.height - imageViewHeight) / 2.f), maxWidth, imageViewHeight);
}
else if (imageRatio < viewRatio) {
CGFloat imageViewWidth = roundf(maxHeight / imageRatio);
imageView.frame = CGRectMake(ceil((maxWidth - imageViewWidth) / 2.f), 0, imageViewWidth, maxHeight);
} else {
//your image view is already at the good size
}
ce code va redimensionner votre vue d'image à son ratio d'image, et aussi positionner la vue d'image au même centre que votre position" par défaut".
PS: j'espère que vous êtes paramètre imageView.layer.shouldRasterise = YES
et imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;
si vous utilisez L'effet d'ombre CALayer ;) il améliorera grandement les performances de votre interface utilisateur.
je pense que ce que vous voulez est un autre content mode
. Essayez d'utiliser UIViewContentModeScaleToFill
. Cela permettra d'adapter le contenu à la taille de ur UIImageView en changeant le format du contenu si nécessaire.
regardez la section content mode
sur le doc officiel pour avoir une meilleure idée des différents modes de contenu disponibles (il est illustré avec des images).
if([[SDWebImageManager sharedManager] diskImageExistsForURL:[NSURL URLWithString:@"URL STRING1"]])
{
NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:[NSURL URLWithString:@"URL STRING1"]];
UIImage *tempImage=[self imageWithImage:[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key] scaledToWidth:cell.imgview.bounds.size.width];
cell.imgview.image=tempImage;
}
else
{
[cell.imgview sd_setImageWithURL:[NSURL URLWithString:@"URL STRING1"] placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)
{
UIImage *tempImage=[self imageWithImage:image scaledToWidth:cell.imgview.bounds.size.width];
cell.imgview.image=tempImage;
// [tableView beginUpdates];
// [tableView endUpdates];
}];
}