2010-06-08 4 views
5

J'ai utilisé CGContextSetShadowWithColor() dans mon code de dessin Quartz sur l'iPhone pour générer le "stomped in" chercher du texte et d'autres choses (en drawRect: et drawLayer:inContext:).CGContextSetShadow() - direction de l'ombre inversée entre iOS 3.0 et 4.0?

ont parfaitement fonctionné, mais lors de l'exécution du même code contre iOS 3.2 et maintenant iOS 4.0 je remarquai que les ombres sont tous dans le sens opposé. Par exemple. dans le code suivant, je mis une ombre noire à 1 pixel ci-dessus le texte qui lui a donné un « pressé dans » regarder, et maintenant cette ombre est 1px ci-dessous le texte, ce qui lui donne une ombre standard.

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

Maintenant, je ne sais pas si je suis (ou ont été) faire quelque chose de mal ou s'il y a eu un changement à la manipulation de ce paramètre. Je n'ai appliqué aucune transformation qui m'expliquerait cela, du moins pas sciemment. J'ai retourné la matrice de texte dans une instance, mais pas dans d'autres et ce comportement est cohérent. De plus, je n'ai pas pu trouver quoi que ce soit à ce sujet dans les notes de mise à jour du SDK, donc il semble que ce soit probablement moi. Quel pourrait être le problème?

+1

J'ai eu le même problème dans mes applications. Je remarque que si mes graphiques sont à l'envers, je sais que ce n'est pas bizarre avec la matrice de transformation. OS bug semble être la seule explication. – qrunchmonkey

Répondre

3

Donc, il semble être soit un bug ou intentionnel par Apple; de toute façon afin de résoudre cela, je suis maintenant en utilisant une catégorie UIView. J'ai mis la direction de l'ombre Y comme il se doit sur iOS 3.2+, mais aussi longtemps que je supporte iOS < 3.2 Je vais utiliser la méthode de classe suivante pour multiplier la direction par 1 ou -1, comme l'exige le dispositif:

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

Voici la catégorie:

@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

C'est un bug qu'ils n'ont pas réussi à corriger, semble-t-il. :)

0

iOS 4.0 a ce même changement de comportement (j'ai trouvé mon chemin ici en cherchant sur CGContextSetShadow en mettant à jour mon application iPhone pour la version 4.0). Donc, apparemment CGContextSetShadow se comporte d'une manière si vous liez sur iPhone OS 3.1.3 et avant, et d'une manière différente si vous liez sur iPhone OS 3.2 ou plus tard.

+0

Exactement. La bonne chose est que vous pouvez simplement vérifier si le périphérique courant tourne <3.2 et agir en conséquence, comme je l'ai fait dans ma catégorie, donc au moins c'est cohérent. – Pascal

+0

Il semble que même si vous liez un SDK plus ancien, l'inversion se produit - voir les ombres renversées de l'application Facebook! –