2009-09-28 16 views
6

Ho un sacco di png con diverse dimensioni e voglio caricarle in un tavolo. Ho questo codice:Le immagini centrate sono sfocate

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

Tutto funziona bene, tranne che le mie png sono sfocate. Se non li centra, sono estremamente nitidi. Sono tutti fatti da curve. Non li ho esportati tutti, quindi ho ancora la possibilità di esportare con una dimensione fissa e i disegni sono già centrati, ma voglio sapere se sto facendo qualcosa di sbagliato o incompleto. Perché sono sfocati?

Credo che non è possibile caricare una foto qui ..

risposta

10

Questo farà in modo che il telaio è a numero intero coordinate:

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 differenza tra questo e

charImage.center = CGPointMake(30, 23); 

è che il cou .center setter ld imposta l'origine a un punto non intero quando la larghezza o l'altezza è della parità errata. Come altre persone hanno detto qui, le immagini e il testo appaiono sfocati quando sono a coordinate non intere.

+0

Perfetto, grazie mille. –

+1

Nota che questa cosa si verifica anche quando la dimensione dell'immagine non è "uniforme" in altezza o larghezza (ad es. Dimensioni 301x199). In tal caso, l'utilizzo di UIViewContentModeCenter potrebbe rendere sfocata l'immagine anche senza utilizzare il centro. –

1

si potrebbe utilizzare calcolato coordinate invece di contentMode:

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

+0

puoi aiutarmi a calcolare alcuni valori fissi? questo è equivalente alla proprietà del centro ma non sono ancora valori fissi, non so come, i limiti sono 46x46px: charImage.frame = CGRectMake ((46- [boundImage char]) .size.width)/2 , (46- [bound di charImage] .size.height)/2, [bound di charImage] .size.width, [charImage bounds] .size.height); –

+0

Penso che sia ok cambiare solo la posizione, non calcolare un nuovo frame, non è vero? Ma non sono sicuro di quale sia la proprietà. –

4

Questo accade perché i PNG vengono inseriti in posizioni sub-pixel . L'utilizzo di sizeToFit insieme a UIViewContentModeCenter rende questo possibile. Quando non si utilizza UIViewContentModeCenter, le viste vengono posizionate su (0.0, 0.0) e quindi non sfocate.

Se si vuole evitare di sfocatura, prima non utilizzare sizeToFit, quindi utilizzare questo per centrare l'immagine:

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

Come ho capito, sizeToFit rende il mio UIImageView prendere la dimensione della UIImage, quindi il contentMode qui non ha alcun effetto, ecco perché l'ho commentato. non sono riuscito a gestire il ridimensionamento di UIImageView, quindi ho preferito centrare direttamente UIImageView. charImage è UIImageView –

+0

Hai ragione: non è necessario impostare la modalità contenuto. Ma con sizeToFit, l'immagine potrebbe essere allungata, e questo di per sé può ovviamente rendere l'immagine sfocata. Vedi risposta aggiornata. – Felixyz

Problemi correlati