framework objective-c cocoa-touch

objective-c - cocoa touch framework



¿Cómo escalar un UIImageView proporcionalmente? (17)

Tengo un UIImageView y el objetivo es reducirlo proporcionalmente dándole una altura o un ancho.

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;

La imagen se redimensionó, pero la posición no está en la parte superior izquierda. ¿Cuál es el mejor enfoque para escalar image / imageView y cómo corrijo la posición?


Acabo de intentar esto y UIImage no admite _imageScaledToSize.

Terminé agregando un método a UIImage usando una categoría, una sugerencia que encontré en los foros de Apple Dev.

En un proyecto .h -

@interface UIImage (Extras) - (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize; @end;

Implementación:

@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;


Aquí es cómo se puede escalar fácilmente.

Esto funciona en 2.x con el simulador y el iPhone.

UIImage *thumbnail = [originalImage _imageScaledToSize:CGSizeMake(40.0, 40.0) interpolationQuality:1];


Configure su ImageView seleccionando Modo para Aspect Fill y marque la casilla Clip Subviews de Clip Subviews .


Creo que puedes hacer algo como

image.center = [[imageView window] center];


Establezca su UIimageview por escala .........


Esto funciona bien para mí Swift 2.x:

imageView.contentMode = .ScaleAspectFill imageView.clipsToBounds = true;



Para Swift:

self.imageViews.contentMode = UIViewContentMode.ScaleToFill


Puedes intentar que el tamaño de imageView coincida con la image . El siguiente código no está probado.

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;


Se corrigió fácilmente, una vez encontré la documentación!

imageView.contentMode = UIViewContentModeScaleAspectFit;


Si las soluciones propuestas aquí no funcionan para usted y su activo de imagen es en realidad un PDF, tenga en cuenta que XCode en realidad trata los PDF de forma diferente a los archivos de imagen. En particular, no parece ser capaz de escalar para rellenar correctamente con un PDF: en lugar de eso, termina en mosaico. Esto me volvió loco hasta que descubrí que el problema era el formato PDF. Conviértete a JPG y deberías estar listo.


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


Uno puede cambiar el tamaño de un UIImage de esta manera

image = [UIImage imageWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];


Usualmente uso este método para mis aplicaciones (compatible con Swift 2.x ):

// 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 }


Utilicé el siguiente código. Donde imageCoverView es UIView tiene 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; }


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];

El código original publicado en la parte superior funcionó bien para mí en iOS 4.2.

Descubrí que crear un CGRect y especificar todos los valores superior, izquierdo, ancho y alto era la forma más fácil de ajustar la posición en mi caso, que usaba un UIImageView dentro de una celda de la tabla. (Todavía es necesario agregar código para liberar objetos)


imageView.contentMode = UIViewContentModeScaleAspectFill; imageView.clipsToBounds = YES;