Я пытаюсь нарисовать тень нестандартной формы, используя 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));
Вот этот выглядит вполне нормально:
Теперь я собираюсь сделать первый прямоугольник шире на 20 пунктов:
CGPathAddRect(shadowPath, NULL, CGRectMake(4, 0, 120, 48));
CGPathAddRect(shadowPath, NULL, CGRectMake(120, 50, 116, 48));
...выглядит уже не так хорошо. Плюс 10 баллов:
CGPathAddRect(shadowPath, NULL, CGRectMake(4, 0, 130, 48));
CGPathAddRect(shadowPath, NULL, CGRectMake(120, 50, 116, 48));
Это совершенно неправильно, не так ли?
Итак, вопрос: что, черт возьми, происходит, я делаю это неправильно или что-то в этом роде? Как вы думаете, это ошибка, и я должен подать отчет?