Ошибка в shadowPath CALayer?

Я пытаюсь нарисовать тень нестандартной формы, используя CALayer:

#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

Вы можете создать пустой проект Cocoa в Xcode, замените ваш app.delegate .m с приведенным выше кодом и попробуйте сами.

Похоже, что специфическая геометрия теневого пути заставляет CALayerсходить с ума.

Например:

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

Вот этот выглядит вполне нормально:

Okay case

Теперь я собираюсь сделать первый прямоугольник шире на 20 пунктов:

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

Whoa case

...выглядит уже не так хорошо. Плюс 10 баллов:

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

WTF case

Это совершенно неправильно, не так ли?

Итак, вопрос: что, черт возьми, происходит, я делаю это неправильно или что-то в этом роде? Как вы думаете, это ошибка, и я должен подать отчет?

6
задан zrslv 9 May 2012 в 18:55
поделиться