2010-01-31 6 views
7

Ho notato che quando si posizionano immagini PNG in una vista usando IB e/o si animano quelle immagini in varie posizioni attorno a una vista, l'immagine a volte può ottenere un leggera sfocatura.Perché un'immagine PNG a volte diventa sfocata a seconda della sua posizione in una vista

Nella maggior parte dei casi è possibile correggere la sfocatura aggiungendo 0,5 pixel di un pixel alla posizione dell'immagine.

[lbLiteButton.layer setPosition:CGPointMake(140.5,159.5)]; 

A volte devo regolare sia x che y come sopra. A volte devo solo regolare x o y.

Ricordo di aver letto da qualche parte che questo ha a che fare con la dimensione dell'immagine e il modo in cui l'animazione di base funziona e qualcosa a che fare con i mezzi pixel ... ma non trovo l'articolo da nessuna parte !?

Il problema con la soluzione ".5 pixel" è diverso per ogni immagine PNG in base alle dimensioni, quindi non è possibile riutilizzare l'animazione personalizzata perché è necessario personalizzarla per ogni immagine diversa.

  1. C'è un modo per garantire che non importa dove posiziono o animare la mia immagine, non otterrò nessuna posizione sfocata?
  2. Qualcuno ha qualche informazione in merito?

Grazie!

+0

Quali sono le dimensioni della tua immagine? La larghezza o l'altezza è dispari? –

risposta

14

La proprietà position del livello di una vista si basa sulla sua proprietà anchorPoint. Di default, è (0.5, 0.5), il che significa che il punto di ancoraggio del livello è al centro. Se la tua vista (e il suo livello) sono un numero dispari di pixel larghi o alti, l'impostazione di un valore integrale per la posizione causerà l'origine della vista non integrale, portando alla sfocatura che vedi.

Per risolvere il problema, è possibile calcolare una versione integrale della posizione prendendo la posizione centrale desiderata della vista, sottraendo metà della larghezza della vista, arrotondando tale valore, quindi aggiungendo metà della larghezza della vista e ripetendo per l'altezza. È inoltre possibile impostare anchorPoint per il livello della vista su (0,0) e posizionare la vista in base all'origine.

C'è una possibilità che questo potrebbe anche essere correlato a un disallineamento di una superview. Per diagnosticare ciò, è possibile utilizzare lo strumento Animazione core in Strumenti e selezionare l'opzione Immagini disallineate. Dovrebbe colorare tutte le viste o i livelli che non sono allineati ai pixel nell'applicazione.

+1

Grazie. Sì, il problema era che alcune delle mie immagini hanno proporzioni pixel pari. Quelli che funzionavano bene, avevano una proporzione uniforme. Cambiare il punto di ancoraggio su (0,0) funziona Inoltre, regolando le dimensioni delle immagini di un pixel, in un editor di immagini, ad un rapporto pari funziona. (Buono se non interessa il pixel) I ora sto per provare lo strumento di animazione principale. Grazie per il vostro aiuto. – Jonathan

+0

Ho provato l'opzione Disallineamento colore e sì, ogni volta che eseguo una "CAKeyFrameAnimation" rigenera la vista di ciò che viene mai animato come "disallineato". Ma le posizioni di partenza e di arresto sono ok. – Jonathan

2

Ho avuto un'esperienza simile con il testo sfocato in un'etichetta, ed è stato causato dal superview delle mie etichette con un offset subpixel. Quindi, anche se la posizione all'interno di quella vista era integrale, una volta adattata alle coordinate del genitore aveva un mezzo pixel o così offset, causando la sfocatura.

Se ciò accade a volte, tuttavia, potrebbe non essere il caso. La tua superview è in movimento o posizionata in modo strano? Direi che la cosa migliore da fare è capire le circostanze precise in cui ciò sta accadendo.

1

IB ha un bug in cui a volte (non spesso) il semplice spostamento degli elementi li renderà confusi - lo si vede più spesso con UILabels e UIImageViews (anche se probabilmente è proprio ciò che è più evidente). Sono sicuro che abbia a che fare con i punti sopra menzionati in qualche modo, ma la correzione è spesso quella di impostare le coordinate di posizione (x, y) per l'elemento su 0,0, e quindi di ritornare ai valori originali. Questo di solito risolve il problema (di nuovo, questo è in IB).