2010-11-08 8 views
8

Tengo una imagen de 16x16 píxeles que quiero mostrar en un UIImageView. Hasta ahora, no hay problema, sin embargo 16x16 es un poco pequeño, así que quiero cambiar el tamaño de la vista de la imagen a 32x32 y, por lo tanto, también escalar la imagen. Pero no puedo hacer que funcione, siempre muestra la imagen con 16x16, sin importar lo que intento. Busqué en Google y encontré muchos fragmentos aquí en Stack Overflow, pero todavía no funciona. Aquí está mi código hasta ahora:Resize UIImageView en UITableViewCell

[[cell.imageView layer] setMagnificationFilter:kCAFilterNearest]; 
[cell.imageView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; 
[cell.imageView setClipsToBounds:NO]; 
[cell.imageView setFrame:CGRectMake(0, 0, 32, 32)]; 
[cell.imageView setBounds:CGRectMake(0, 0, 32, 32)]; 
[cell.imageView setImage:image]; 

no quiero para crear una nueva imagen de 32x32 píxeles porque ya tengo algunos problemas de memoria en los dispositivos más antiguos y la creación de dos imágenes en lugar de tener sólo uno parece una muy un mal enfoque para mí (las imágenes pueden escalarse perfectamente y no importa si pierden calidad).

Respuesta

30

¡Lo he logrado con éxito usando CGAffineTransformMakeScale!

cell.imageView.image = cellImage; 
//self.rowWidth is the desired Width 
//self.rowHeight is the desired height 
CGFloat widthScale = self.rowWidth/cellImage.size.width; 
CGFloat heightScale = self.rowHeight/cellImage.size.height; 
//this line will do it! 
cell.imageView.transform = CGAffineTransformMakeScale(widthScale, heightScale); 
+0

Esta es una buena solución de cinta de conducto, si no desea subclasificar UITableViewCell. – jdc

+0

¿Qué es cellImage.size.width? Estoy usando el método initWithStyle – Dejell

+0

cellImage es un UIImageView de temperatura utilizado para calcular el ancho y la altura. – Ahmed

4

creo que es necesario para establecer el contentMode:

cell.imageView.contentMode = UIViewContentModeScaleAspectFit; 

En contexto:

UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"slashdot" ofType:@"png"]]; 
imageView = [[UIImageView alloc] initWithImage:image]; 
[imageView setBackgroundColor:[UIColor greenColor]]; 
[imageView setFrame:CGRectMake(x,y,32,32)]; 
imageView.contentMode = UIViewContentModeScaleAspectFit;  
[self.view addSubview:imageView]; 

Nota: He creado un color de fondo para que pueda depurar los límites de la pantalla de la UIImageView. También x y y son coordenadas enteras arbitrarias.

+0

sigue sin funcionar – JustSid

+0

Gracias por la actualización, pero todavía no funciona. Si creo un UIImageView como lo hizo, todo funciona bien, pero el UIImageView de UITableViewCell se comporta de manera diferente. Lo probé también con otro color de fondo para verificar que también la vista en sí misma tenga un marco de 16x16. – JustSid

+0

De acuerdo, parece que UITableViewCell actualiza el marco de todos modos, no importa lo que haga. Ahora estoy creando las etiquetas y el UIImageView y las agregué al contentView de la celda. – JustSid

1

Usando CGAffineTransformMakeScele como @ahmed dicho es válido y qué no parece haber solución tipo de pato y col! Por ejemplo, si tiene una imagen grande y la coloca en una UITableViewCell (supongamos que la imagen es 2 veces más grande que la que cabe en una celda de la tabla. Si escala en 0,9, no verá ningún resultado. menos de 0.5 (porque 0.5 * 2.0 = 1.0 que es el tamaño de la celda). Así que parece que dentro de la API, la manzana está haciendo exactamente eso.

1

Debe sobrescribir el método layoutSubviews. De forma predeterminada, está cambiando el tamaño la imageview basado en el tamaño altura de la celda.

-(void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    self.imageView.frame = CGRectMake(self.imageView.frame.origin.x, 
             self.imageView.frame.origin.y, 
             MY_ICON_SIZE, 
             MY_ICON_SIZE); 
} 

es probable que desee volver a calcular el origen, así por lo que se centra verticalmente.

Cuestiones relacionadas