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];
Esto funciona bien para mí Swift 2.x:
imageView.contentMode = .ScaleAspectFill
imageView.clipsToBounds = true;
He visto un poco de conversación sobre los tipos de escala, así que decidí armar un artículo sobre algunos de los tipos de escalado de modo de contenido más populares .
La imagen asociada está aquí:
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;