Como dimensionar um UIImageView proporcionalmente?

Eu tenho um UIImageView e o objective é reduzi-lo proporcionalmente, dando-lhe uma altura ou largura.

UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://sofpt.miximages.com/objective-c/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; 

A imagem foi redimensionada, mas a posição não está no canto superior esquerdo. Qual é a melhor abordagem para dimensionar imagem / imageView e como corrijo a posição?

Corrigido facilmente, uma vez que encontrei a documentação!

  imageView.contentMode = UIViewContentModeScaleAspectFit; 

Eu vi um pouco de conversa sobre os tipos de escala, então decidi montar um artigo sobre alguns dos mais populares tipos de escala de modo de conteúdo .

A imagem associada está aqui:

insira a descrição da imagem aqui

Eu apenas tentei isso, e UIImage não suporta _imageScaledToSize.

Acabei adicionando um método ao UIImage usando uma categoria – uma sugestão que encontrei nos fóruns do Apple Dev.

Em todo o projeto .h –

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

Implementação:

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

Você pode tentar fazer com que o tamanho imageView corresponda à image . O código a seguir não é testado.

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

O código original postado no topo funcionou bem para mim no iOS 4.2.

Descobri que criar um CGRect e especificar todos os valores de topo, esquerda, largura e altura era a maneira mais fácil de ajustar a posição no meu caso, que estava usando um UIImageView dentro de uma célula da tabela. (Ainda precisa adicionar código para liberar objects)

pode-se resize um UIImage dessa maneira

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

Defina o seu ImageView selecionando Modo para Aspect Fill e marque a checkbox Clip Subviews de Clip Subviews .

insira a descrição da imagem aqui

Isso funciona bem para mim Swift 2.x:

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

Para Swift:

 self.imageViews.contentMode = UIViewContentMode.ScaleToFill 

Defina seu UIimageview por escala ………

insira a descrição da imagem aqui

UIImageView + Scale.h:

 #import  @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 

Eu usei o seguinte código. Onde imageCoverView é UIView detém UIImageView

 if (image.size.height 

Se as soluções propostas aqui não estiverem funcionando para você e seu recurso de imagem for realmente um PDF, observe que o XCode realmente trata os PDFs de maneira diferente dos arquivos de imagem. Em particular, não parece ser capaz de escalar para preencher adequadamente um PDF: ele acaba ficando lado a lado. Isso me deixou louco até que percebi que o problema era o formato PDF. Converta para JPG e você deve estar pronto para ir.

Normalmente eu uso esse método para meus aplicativos (compatível com 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 } 

Eu acho que você pode fazer algo como

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

Aqui está como você pode escalá-lo facilmente.

Isso funciona no 2.x com o simulador e o iPhone.

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