J'ai cette 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 prendre l’image (quel que soit le format et la résolution) et que je souhaite l’adapter aux limites, de sorte que l’image ne les dépasse pas eux, mais elle peut les réduire ça veut. (marqué en rouge dans l'image):
Pour l’instant, l’image prend correctement la taille requise, mais j’ai 2 soucis: 1. La UIImageView
n’est pas égale à la taille de l’image redimensionnée, ce qui laisse un arrière-plan rouge (et je ne le veux pas) 2. Si l’image est plus petite que la hauteur de ma UIImageView
ne soit pas redimensionnée pour être plus petite, elle 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 puis-je changer dynamiquement la taille non seulement du UIImageView.image
, mais de l’ensemble UIImageView
, rendant ainsi sa taille totalement ajustable à son contenu. Toute aide serait très appréciée, merci!
Lorsque vous obtenez la largeur et la hauteur d'une image redimensionnée Obtenez 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 cela fonctionnait, mais je pense que tout devrait bien se passer
- (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 de 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
}
}
Usage:
let image = UIImage(named: "Icon")
item.icon = image?.scaleToSize(CGSize(width: 30.0, height: 30.0))
Utilisez la catégorie ci-dessous puis appliquez la bordure de Quartz à 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 définissez-vous pas le frame.size
de la vue d'image sur cette taille?
MODIFIER----
Ok, donc en voyant ton commentaire je 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 redimensionnera votre affichage d'image à son rapport d'image et le positionnera au même centre que votre position "par défaut".
PS: J'espère que vous définissez imageView.layer.shouldRasterise = YES
Et imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;
si vous utilisez l'effet d'ombre CALayer;), cela améliorera considérablement les performances de votre interface utilisateur.
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];
}];
}
Je pense que ce que vous voulez, c'est un content mode
différent. Essayez d’utiliser UIViewContentModeScaleToFill
. Cela redimensionnera le contenu pour l'adapter à la taille de votre UIImageView en modifiant le format du contenu si nécessaire.
Consultez la section content mode
de la documentation officielle pour avoir une meilleure idée des différents modes de contenu disponibles (il est illustré par des images).