J'ai un UIImageView et l'objectif est de le réduire proportionnellement en lui donnant une hauteur ou une largeur.
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
//Add image view
[self.view addSubview:imageView];
//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;
//change width of frame
CGRect frame = imageView.frame;
frame.size.width = 100;
imageView.frame = frame;
L'image a été redimensionnée mais la position n'est pas en haut à gauche. Quelle est la meilleure approche pour redimensionner image/imageView et comment corriger la position?
Fixé facilement, une fois que j'ai trouvé la documentation!
imageView.contentMode = UIViewContentModeScaleAspectFit;
J'ai assisté à quelques conversations sur les types d'échelle, j'ai donc décidé de créer un article sur certains des types d'échelle les plus populaires en mode conten .
L'image associée est ici:
Je viens d'essayer cela, et UIImage ne supporte pas _imageScaledToSize.
J'ai fini par ajouter une méthode à UIImage en utilisant une catégorie - une suggestion trouvée sur les forums Apple Dev.
Dans un projet .h -
@interface UIImage (Extras)
- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
@end;
La mise en oeuvre:
@implementation UIImage (Extras)
- (UIImage *)imageByScalingProportionallyToSize:(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;
else
scaleFactor = heightFactor;
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;
}
}
// this is actually the interesting part:
UIGraphicsBeginImageContext(targetSize);
CGRect thumbnailRect = CGRectZero;
thumbnailRect.Origin = thumbnailPoint;
thumbnailRect.size.width = scaledWidth;
thumbnailRect.size.height = scaledHeight;
[sourceImage drawInRect:thumbnailRect];
newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
if(newImage == nil) NSLog(@"could not scale image");
return newImage ;
}
@end;
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.clipsToBounds = YES;
Vous pouvez essayer de faire correspondre la taille imageView
à la image
. Le code suivant n'est pas testé.
CGSize kMaxImageViewSize = {.width = 100, .height = 100};
CGSize imageSize = image.size;
CGFloat aspectRatio = imageSize.width / imageSize.height;
CGRect frame = imageView.frame;
if (kMaxImageViewSize.width / aspectRatio <= kMaxImageViewSize.height)
{
frame.size.width = kMaxImageViewSize.width;
frame.size.height = frame.size.width / aspectRatio;
}
else
{
frame.size.height = kMaxImageViewSize.height;
frame.size.width = frame.size.height * aspectRatio;
}
imageView.frame = frame;
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;
//change width of frame
//CGRect frame = imageView.frame;
//frame.size.width = 100;
//imageView.frame = frame;
//original lines that deal with frame commented out, yo.
imageView.frame = CGRectMake(10, 20, 60, 60);
...
//Add image view
[myView addSubview:imageView];
Le code original affiché en haut a bien fonctionné pour moi dans iOS 4.2.
J'ai constaté que la création d'un CGRect et la spécification de toutes les valeurs supérieure, gauche, largeur et hauteur constituaient le moyen le plus simple d'ajuster la position dans mon cas, qui utilisait UIImageView dans une cellule de tableau. (Encore besoin d'ajouter du code pour libérer des objets)
on peut redimensionner une UIImage de cette façon
image = [UIImage imageWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];
Configurez votre ImageView en sélectionnant Mode sur Aspect Fill
et cochez la case Clip Subviews
.
Cela fonctionne très bien pour moi Swift 2.x:
imageView.contentMode = .ScaleAspectFill
imageView.clipsToBounds = true;
Pour Swift:
self.imageViews.contentMode = UIViewContentMode.ScaleToFill
UIImageView + Scale.h:
#import <Foundation/Foundation.h>
@interface UIImageView (Scale)
-(void) scaleAspectFit:(CGFloat) scaleFactor;
@end
UIImageView + Scale.m:
#import "UIImageView+Scale.h"
@implementation UIImageView (Scale)
-(void) scaleAspectFit:(CGFloat) scaleFactor{
self.contentScaleFactor = scaleFactor;
self.transform = CGAffineTransformMakeScale(scaleFactor, scaleFactor);
CGRect newRect = self.frame;
newRect.Origin.x = 0;
newRect.Origin.y = 0;
self.frame = newRect;
}
@end
Si les solutions proposées ici ne fonctionnent pas et si votre ressource image est en réalité un PDF, notez que XCode traite les PDF différemment des fichiers image. En particulier, il semble impossible de s’adapter pour remplir correctement avec un PDF: il finit par être affiché en mosaïque. Cela m'a rendu fou jusqu'à ce que je découvre qu'il s'agissait du format PDF. Convertissez au format JPG et vous devriez être prêt à partir.
J'ai utilisé le code suivant. Où imageCoverView est UIView détient UIImageView
if (image.size.height<self.imageCoverView.bounds.size.height && image.size.width<self.imageCoverView.bounds.size.width)
{
[self.profileImageView sizeToFit];
self.profileImageView.contentMode =UIViewContentModeCenter
}
else
{
self.profileImageView.contentMode =UIViewContentModeScaleAspectFit;
}
J'utilise généralement cette méthode pour mes applications (Swift 2.x compatible):
// Resize UIImage
func resizeImage(image:UIImage, scaleX:CGFloat,scaleY:CGFloat) ->UIImage {
let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(scaleX, scaleY))
let hasAlpha = true
let scale: CGFloat = 0.0 // Automatically use scale factor of main screen
UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
image.drawInRect(CGRect(Origin: CGPointZero, size: size))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
}
Je pense que tu peux faire quelque chose comme
image.center = [[imageView window] center];