2010-04-21 14 views
8

Domanda iPhone SDK: Sto disegnando un UIImageView sullo schermo. L'ho ruotato in 3D e fornito un po 'di prospettiva, quindi l'immagine sembra puntata sullo schermo in un angolo. Tutto funziona bene Ora il problema è che i bordi dell'immagine risultante non sembrano affatto antialiasing. Qualcuno sa come farlo?iPhone: CALayer + ruota in 3D + antialias?

In sostanza, sto implementando la mia versione di CoverFlow (sì sì, design patent blah blah) usando le trasformazioni al quarzo 3d per fare tutto. Funziona bene, tranne per il fatto che ogni cover non è antialiasata e la versione di Apple è.

Ho provato nei guai con l'edgeAntialisingMask del CALayer, ma questo non ha aiutato - le impostazioni predefinite sono che ogni bordo deve essere antialias ...

grazie!

+0

State impostazione 'edgeAntialiasingMask' a' kCALayerLeftEdge | kCALayerRightEdge | kCALayerTopEdge | kCALayerBottomEdge'? – rpetrich

+0

sì, ci ho provato. inoltre, quella combinazione è l'impostazione predefinita per quella proprietà – Colin

+0

Sembra che i pixel di bordo trasparenti siano la via da seguire (in questo modo 'magnificationFilter' e' minificationFilter' si prenderanno cura di esso) – rpetrich

risposta

3

Si potrebbe provare ad aggiungere alcuni pixel trasparenti attorno al bordo dell'immagine, posizionando UIImageView in una vista vuota leggermente più grande a cui si applica la rotazione o modificando le immagini di origine.

+1

Mettere il 'UIImageView' in una vista più ampia e quindi applicare una trasformazione non avrà alcun effetto - i sottolivelli non sono composti nei loro genitori, piuttosto l'intero grafico è composto dalla GPU. L'aggiunta di pixel trasparenti al bordo dell'immagine dovrebbe comunque funzionare bene. – rpetrich

19

Se si ruota solo un'immagine, un trucco risolverà il problema. Prova a impostare

layer.shadowOpacity = 0,01;

Dopo quella foto avrà un aspetto più liscio dopo la rotazione 3D

+1

l'uomo che risponde merita un distintivo d'oro! – apouche

+1

Se funziona, dovrebbe essere alzato! – tipycalFlow

7

La risposta Gloomcore danno un risultato veramente pulito.

tuttavia questo a volte rende le cose veramente LAGGY! Aggiunta di rasterizzazione aiutare un po ':

.layer.shadowOpacity = 0.01; 
.layer.shouldRasterize = YES; 

So che la domanda/risposta è vecchio, ma hey ho appena trovato.

+0

Sì, l'aggiunta della rasterizzazione aiuta solo un po '. Ma è ancora lento, sfortunatamente. –

0

Avevo un problema simile risolto solo impostando shouldRasterize = YES, tuttavia poiché stavo riutilizzando le mie viste (e livelli), shouldRasterize = YES ha ucciso la performance.

Fortunatamente ho trovato una soluzione girando dovrebbeRasterize = NO al momento giusto per ripristinare le prestazioni nel caso della mia app.

ho postato una soluzione qui: Antialiasing edges of UIView after transformation using CALayer's transform

0

si può provare questo metodo

: Usando layer.shouldRasterize

  1. Creare un superlayer/superview che è 1 pixel più grande nelle 4 direzioni
  2. Esegui la trasformazione su superlayer/superview
  3. Attivare layer.shouldRasterize sull'originale layer/view

Metodo: Disegno per un UIImage

  • Disegna il contenuto in un UIImage
  • Assicurarsi che si dispone di un bordo trasparente di 1 pixel intorno al contenuto
  • Mostra l'immagine

Riferimento: http://darknoon.com/2012/05/18/the-transparent-border-trick/