2012-05-09 16 views
6

Próbuję narysować niestandardowy kształt cienia używając CALayer:Błąd w cieniu CALayera.

#import <QuartzCore/QuartzCore.h> 

@implementation ZKSBAppDelegate 

@synthesize window = _window; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSView *view = self.window.contentView; 
    view.wantsLayer = YES; 

    CALayer *shadowLayer = [CALayer layer]; 
    shadowLayer.shadowOpacity = 1; 
    shadowLayer.shadowRadius = 1; 
    shadowLayer.shadowOffset = NSMakeSize(0, 0); 

    CGMutablePathRef shadowPath = CGPathCreateMutable(); 
    // setting the following rect's width to 100 fixes everything. 
    // setting it to 130 screws the shadow even more. 
    CGPathAddRect(shadowPath, NULL, CGRectMake(4, 0, 120, 48)); 
    CGPathAddRect(shadowPath, NULL, CGRectMake(120, 50, 116, 48)); 
    shadowLayer.shadowPath = shadowPath; 
    CGPathRelease(shadowPath); 

    [view.layer addSublayer:shadowLayer]; 
} 
@end 

można utworzyć pusty projekt kakao w Xcode, zastąpi zawartość pliku .m Twojego app.delegate jest z powyższego kodu i spróbować samemu .

Wygląda na to, że specyficzna geometria ścieżki cienia powoduje, że CALayer może się zepsuć.

Na przykład:

CGPathAddRect(shadowPath, NULL, CGRectMake(4, 0, 100, 48)); 
CGPathAddRect(shadowPath, NULL, CGRectMake(120, 50, 116, 48)); 

Ten doskonale wygląda w porządku:

Okay case

Teraz mam zamiar zrobić 1st prostokąt szerszy o 20 punktów:

CGPathAddRect(shadowPath, NULL, CGRectMake(4, 0, 120, 48)); 
CGPathAddRect(shadowPath, NULL, CGRectMake(120, 50, 116, 48)); 

Whoa case

... nie wygląda już tak dobrze. Plus 10 punktów:

CGPathAddRect(shadowPath, NULL, CGRectMake(4, 0, 130, 48)); 
CGPathAddRect(shadowPath, NULL, CGRectMake(120, 50, 116, 48)); 

WTF case

Teraz to jest bzdura, prawda?

Pytanie brzmi: co do cholery się dzieje, czy robię to źle, czy coś w tym stylu? Czy uważasz, że to błąd i powinienem złożyć raport?

Odpowiedz

3

Tak, to brzmi jak błąd. Nawet jeśli tak nie jest, zgłaszając zgłoszenie błędu, firma Apple powinna odpowiedzieć i udzielić użytecznych informacji.

+0

Tak, ** zdecydowanie ** zgłoś zgłoszenie. Inżynierowie Apple najprawdopodobniej nie odkryją tego rodzaju rzeczy, dopóki ich nie poinformujemy. –

+0

@ DavidRönnqvist to mógł być błąd z mojej strony, nie chciał wzbudzić fałszywego alarmu. – zrxq

+0

Pięć miesięcy później: Nic. – zrxq