2010-11-08 6 views
8

J'ai une image de 16x16 pixels que je veux afficher dans un UIImageView. Jusqu'à présent, aucun problème, mais 16x16 est un peu petit, donc je veux redimensionner la vue de l'image à 32x32 et ainsi mettre à jour l'image. Mais je ne peux pas le faire fonctionner, il montre toujours l'image avec 16x16, peu importe ce que j'essaie. J'ai beaucoup googlé et trouvé de nombreux extraits sur Stack Overflow, mais ça ne marche toujours pas. Voici mon code à ce jour:Redimensionner UIImageView dans 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]; 

Je ne veux pas créer une nouvelle image de 32x32 pixels parce que je l'ai déjà quelques problèmes de mémoire sur les appareils plus anciens et la création de deux images au lieu d'avoir juste un ressemble à une très mauvaise approche pour moi (les images peuvent être parfaitement mises à l'échelle et peu importe si elles perdent de la qualité).

Répondre

30

Je l'ai réussi avec 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

C'est une bonne solution, bien que vous ne vouliez pas sous-classer UITableViewCell. – jdc

+0

Qu'est-ce que cellImage.size.width? J'utilise la méthode initWithStyle – Dejell

+0

cellImage est un UIImageView temporaire utilisé pour calculer la largeur et la hauteur. – Ahmed

4

Je pense que vous devez définir le contentMode:

cell.imageView.contentMode = UIViewContentModeScaleAspectFit; 

Dans le contexte:

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

Note: J'ai mis une couleur d'arrière-plan afin que vous puissiez déboguer les limites à l'écran du UIImageView. En outre, x et y sont des coordonnées entières arbitraires.

+0

ne fonctionne toujours pas – JustSid

+0

Merci pour la mise à jour, mais cela ne fonctionne toujours pas. Si je crée un UIImageView comme vous l'avez fait, tout fonctionne correctement, mais le UIImageView de UITableViewCell se comporte différemment. Je l'ai testé aussi avec une autre couleur de fond pour vérifier que la vue elle-même a toujours un cadre de 16x16. – JustSid

+0

D'accord, on dirait qu'un UITableViewCell met à jour le cadre quand même, peu importe ce que je fais. Je crée maintenant les étiquettes et le UIImageView par moi-même et les ajoute au contentView de la cellule. – JustSid

1

En utilisant CGAffineTransformMakeScele comme @ahmed dit est valide et ne semble pas être une solution de type de canard à al! Par exemple, si vous avez une grande image et la placez dans un UITableViewCell (disons que l'image est 2x plus grande que celle qui rentre dans une cellule de table.) Si vous faites une échelle de 0.9, vous ne voyez aucun résultat. moins de 0.5 (parce que 0.5 * 2.0 = 1.0 qui est la taille de la cellule) Donc, il semble que dans l'API, Apple fait exactement cela

1

Vous devez remplacer la méthode layoutSubviews. la imageview en fonction de la taille de la hauteur des cellules.

-(void)layoutSubviews 
{ 
    [super layoutSubviews]; 

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

Vous aurez probablement envie recalcule l'origine et il est centré verticalement.

Questions connexes