2010-04-21 9 views
8

Una pregunta de iPhone SDK: dibujo un UIImageView en la pantalla. Lo giré en 3D y proporcioné un poco de perspectiva, por lo que la imagen se ve como si apuntara a la pantalla en ángulo. Eso todo funciona bien. Ahora el problema es que los bordes de la imagen resultante no parecen estar antialias en absoluto. ¿Alguien sabe cómo hacerlo?iPhone: ¿CALayer + gira en 3D + antialias?

Básicamente, estoy implementando mi propia versión de CoverFlow (si, si, diseño de patente, bla, bla) usando transformaciones de cuarzo en 3D para hacer de todo. Funciona bien, excepto que cada portada no tiene antialias, y la versión de Apple es.

He tratado de jugar un poco con el edgeAntialisingMask del CALayer, pero eso no ayuda - por defecto es que cada margen debe ser filtros antialiasing ...

gracias!

+0

Es usted la creación '' edgeAntialiasingMask' a kCALayerLeftEdge | kCALayerRightEdge | kCALayerTopEdge | kCALayerBottomEdge'? – rpetrich

+0

sí, lo intenté. también, esa combinación es el valor predeterminado para esa propiedad – Colin

+0

Parece que los píxeles de borde transparentes son el camino a seguir (de esa manera 'magnificationFilter' y' minificationFilter' se encargarán de ello) – rpetrich

Respuesta

3

Puede intentar agregar algunos píxeles transparentes alrededor del borde de la imagen, ya sea colocando el UIImageView en una vista vacía un poco más grande a la que aplique la rotación o cambiando las imágenes de origen.

+1

Poniendo 'UIImageView' en una vista más grande y luego aplicando una transformación no tendrá ningún efecto: las subcapas no se compilan en sus padres, sino que la GPU compone todo el gráfico. Sin embargo, agregar píxeles transparentes al borde de la imagen debería funcionar bien. – rpetrich

19

Si gira solo una imagen, entonces un truco resolverá el problema. Intente establecer

layer.shadowOpacity = 0.01;

Después de que la imagen se verá más suave después de la rotación 3D

+1

¡esa respuesta merece una insignia de oro! – apouche

+1

¡Si funciona, debe ser votado! – tipycalFlow

7

La respuesta Gloomcore dan un resultado muy ordenado.

¡sin embargo esto a veces hace las cosas realmente RIZADAS! Adición de rasterización ayudar un poco:

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

Sé que la pregunta/respuesta es viejo, pero bueno i acaba de encontrar.

+0

Sí, agregar rasterización ayuda solo un poco. Pero sigue siendo laggy, desafortunadamente. –

0

Tuve un problema similar que se solucionó configurando shouldRasterize = YES, sin embargo, debido a que estaba reutilizando mis vistas (y capas), el shouldRasterize = YES mató el rendimiento.

Afortunadamente encontré una solución girando shouldRasterize = NO en el momento adecuado para restaurar el rendimiento en el caso de mi aplicación.

he publicado una solución aquí: Antialiasing edges of UIView after transformation using CALayer's transform

0

Usted puede probar este método

: El uso de layer.shouldRasterize

  1. Crear un superlayer/superview que es de 1 píxel más grande en las 4 direcciones
  2. Haga la transformación en el superlayer/superview
  3. Habilitar layer.shouldRasterize en el original layer/view

Método: Dibujo a un UIImage

  • Dibuje su contenido a un UIImage
  • Asegúrese de que tiene un borde transparente de 1 píxel alrededor del contenido
  • Mostrar la imagen

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

Cuestiones relacionadas