2010-06-08 2 views
5

Ho utilizzato CGContextSetShadowWithColor() nel mio codice di disegno al quarzo su iPhone per generare l'aspetto "stompato" per il testo e altre cose (in drawRect: e drawLayer:inContext:).CGContextSetShadow() - direzione dell'ombra invertita tra iOS 3.0 e 4.0?

Ha funzionato perfettamente, ma quando ho eseguito lo stesso identico codice su iOS 3.2 e ora su iOS 4.0 ho notato che le ombre sono tutte nella direzione opposta. Per esempio. nel codice seguente ho impostato un'ombra nera su 1 pixel sopra il il testo, che gli ha dato un aspetto "premuto", e ora questa ombra è 1px sotto il testo, dandogli un'ombra standard.

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

Ora io non so se io sono (o sono stati) facendo qualcosa di sbagliato o se vi sia stato un cambiamento per la gestione di questa impostazione. Non ho applicato alcuna trasformazione che mi spiegasse questo, almeno non consapevolmente. Ho capovolto la matrice di testo in un'istanza, ma non in altre e questo comportamento è coerente. Inoltre non sono stato in grado di trovare nulla a riguardo nelle note di rilascio dell'SDK, quindi sembra che sia probabilmente io. Quale potrebbe essere il problema?

+1

Ho avuto lo stesso problema nelle mie app. Avrei notato se la mia grafica si stava sottosopra, quindi so che non è una stranezza con la matrice di trasformazione. Il bug del sistema operativo sembra l'unica spiegazione. – qrunchmonkey

risposta

3

Quindi sembra essere un bug o intenzionale di Apple; in entrambi i casi per risolvere questo sto usando una categoria UIView. Ho impostato l'ombra direzione Y come dovrebbe essere su iOS 3.2+, ma fintanto che sto supportando iOS < 3.2 Userò il seguente metodo di classe per moltiplicare la direzione di 1 o -1, secondo necessità dal dispositivo:

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

Ecco la categoria:

@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

È un errore che non sono riusciti a risolvere, a quanto pare. :)

0

iOS 4.0 ha questo stesso cambiamento di comportamento (ho trovato la mia strada qui effettuando una ricerca su CGContextSetShadow durante l'aggiornamento il mio iPhone app per 4,0). Quindi, apparentemente CGContextSetShadow si comporta in un modo se ci si collega a iPhone OS 3.1.3 e prima, e in un modo diverso se si collega a iPhone OS 3.2 o versioni successive.

+0

Esattamente. La cosa buona è che puoi semplicemente controllare se il dispositivo corrente funziona <3.2 e agire di conseguenza, come ho fatto nella mia categoria, quindi almeno questo è coerente. – Pascal

+0

Sembra che anche se ci si collega a un SDK precedente si verifica l'inversione: vedi le ombre invertite dell'app Facebook! –