2009-09-28 11 views
6

J'ai beaucoup de png avec des tailles différentes, et je veux les charger dans une table. J'ai ce code:Les images centrées sont floues

charImage.image = [self imageForId:g.charId glyphNr:g.glyphNr]; 
[charImage sizeToFit]; 
//charImage.contentMode = UIViewContentModeCenter; 
charImage.center = CGPointMake(30, 23); 

Tout fonctionne bien sauf que mes png sont flous. Si je ne les centre pas, ils sont extrêmement pointus. Ils sont tous fabriqués à partir de courbes. Je ne les ai pas tous exportés, donc c'est toujours une chance d'exporter avec une taille fixe et les dessins déjà centrés, mais je veux savoir si je fais quelque chose de mal ou de incomplet. Pourquoi sont-ils flous?

Je pense n'est pas possible de télécharger une photo ici ..

Répondre

10

Cela fera que le cadre est aux coordonnées entier:

int centerX = 30; 
int centerY = 23; 
CGSize size = charImage.frame.size; 
charImage.frame = CGRectMake((int)(centerX - size.width/2), 
          (int)(centerY - size.height/2), 
          size.width, size.height); 

la différence entre ceci et

charImage.center = CGPointMake(30, 23); 

est que le COU setter .center ld définit l'origine sur un point non entier lorsque la largeur ou la hauteur est de la mauvaise parité. Comme d'autres personnes l'ont dit ici, les images et les textes ont l'air flous lorsqu'ils sont à des coordonnées non entières.

+0

Parfait, merci beaucoup. –

+1

Notez que cela se produit également lorsque la taille de votre image n'est pas "égale" en hauteur ou en largeur (par exemple, taille 301x199). Dans ce cas, l'utilisation de UIViewContentModeCenter peut rendre votre image floue même sans utiliser de centre. –

1

vous pouvez utiliser les coordonnées calculées au lieu de contentMode:

charImage.frame = CGRectMake(x,y,width,height)

+0

pouvez-vous m'aider à calculer certaines valeurs fixes? ceci est équivalent à la propriété center mais ils ne sont pas encore des valeurs fixes, je ne sais pas comment, les limites sont 46x46px: charImage.frame = CGRectMake ((46- [charImage bounds] .size.width)/2 , (46- [limites charImage] .size.height)/2, [limites charImage] .size.width, [limites charImage] .size.height); –

+0

Je pense que c'est correct de changer seulement la position, pas de calculer un nouveau cadre, n'est-ce pas? Mais je ne sais pas quelle est la propriété. –

4

Cela se produit parce que les PNGs se placer à des positions sous-pixels . Utiliser sizeToFit avec UIViewContentModeCenter rend cela possible. Lorsque vous n'utilisez pas UIViewContentModeCenter, les vues sont placées à (0.0, 0.0) et ne flouent donc pas.

Si vous voulez éviter le flou, d'abord ne pas utiliser sizeToFit, utilisez ce pour centrer l'image:

image.frame = CGRectMake(round(centerX - image.frame.size.width/2.0), 
         round(centerY - image.frame.size.height/2.0), 
         image.frame.size.width, 
         image.frame.size.height); 
+0

Comme je comprends le sizeToFit rend mon UIImageView pour prendre la taille de l'UIImage, donc le contentMode ici n'a aucun effet, c'est pourquoi je l'ai commenté. Je ne pouvais pas gérer les scalings de l'UIImageView, donc j'ai préféré centrer directement le UIImageView. charImage est un UIImageView –

+0

Vous avez raison: vous n'avez pas besoin de définir le mode contenu. Mais si vous sizeToFit, l'image peut être étirée, et cela en soi peut bien sûr rendre l'image floue. Voir la mise à jour – Felixyz

Questions connexes