2010-06-08 3 views
5

He estado usando CGContextSetShadowWithColor() en mi código de dibujo de Quartz en el iPhone para generar el aspecto "pisoteado" de texto y otras cosas (en drawRect: y drawLayer:inContext:).CGContextSetShadow(): dirección de la sombra invertida entre iOS 3.0 y 4.0?

Funcionó a la perfección, pero cuando se ejecuta el mismo código exacto contra iOS 3.2 y ahora iOS 4.0 noté que las sombras son todas en la dirección opuesta. P.ej. en el siguiente código establecí una sombra negra para que sea 1 píxel sobre el texto, que le dio un aspecto "presionado", y ahora esta sombra es 1px debajo de el texto, dándole una sombra estándar.

... 
CGContextSetShadowWithColor(context, CGSizeMake(0.f, 1.f), 0.5f, shadowColor); 
CGContextShowGlyphsAtPoint(context, origin.x, origin.y, glyphs, length); 
... 

Ahora no sé si soy (o han sido) haciendo algo mal o si se ha producido un cambio en el manejo de este ajuste. No he aplicado ninguna transformación que me explique esto, al menos no a sabiendas. He volteado la matriz de texto en una instancia, pero no en otras, y este comportamiento es consistente. Además, no pude encontrar nada al respecto en las Notas de la versión del SDK, por lo que parece que soy yo. ¿Cuál podría ser el problema?

+1

He estado teniendo el mismo problema en mis aplicaciones. Notaría si mis gráficos se dibujaban al revés, así que sé que no es una rareza con la matriz de transformación. El error del sistema operativo parece ser la única explicación. – qrunchmonkey

Respuesta

3

Parece ser un error o intencional de Apple; De cualquier manera para resolver esto, ahora estoy usando una categoría UIView. Establecí la dirección Y de la sombra como debería ser en iOS 3.2+, pero siempre y cuando soporte iOS < 3.2 Usaré el siguiente método de clase para multiplicar la dirección en 1 o -1, según sea necesario. dispositivo:

... 
CGContextSetShadowWithColor(context, CGSizeMake(0.f, [UIView shadowVerticalMultiplier] * -1.f), 0.5f, textShadowColor); 
... 

aquí está la categoría:

@interface UIView (shadowBug) 

+ (NSInteger) shadowVerticalMultiplier;  

@end 


@implementation UIView (shadowBug) 

+ (NSInteger) shadowVerticalMultiplier 
{ 
    static NSInteger shadowVerticalMultiplier = 0; 
    if (0 == shadowVerticalMultiplier) { 
     CGFloat systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; 
     shadowVerticalMultiplier = (systemVersion < 3.2f) ? -1 : 1; 
    } 

    return shadowVerticalMultiplier; 
} 


@end 
0

Parece que es un error que no arreglaron. :)

0

iOS 4.0 tiene este mismo cambio de comportamiento (he encontrado mi camino aquí mediante la búsqueda en CGContextSetShadow al actualizar mi aplicación para iPhone 4.0). Por lo tanto, al parecer, CGContextSetShadow se comporta de una manera si enlaza con iPhone OS 3.1.3 y anteriores, y de una manera diferente si enlaza con iPhone OS 3.2 o posterior.

+0

Exactamente. Lo bueno es que puedes simplemente comprobar si el dispositivo actual funciona <3.2 y actuar en consecuencia, como hice en mi categoría, por lo que al menos esto es coherente. – Pascal

+0

Parece que incluso si establece un vínculo con un SDK antiguo, ocurre la reversión: ¡consulte las sombras invertidas de la aplicación de Facebook! –

Cuestiones relacionadas