Я использую NSImage
метод -lockFocusFlipped:
, чтобы сделать рисунок в изображении. Мой код выглядит так:
NSImage *image = [[NSImage alloc] initWithSize:NSMakeSize(256, 256)];
[image lockFocusFlipped:YES];
NSShadow *shadow = [[NSShadow alloc] init];
[shadow setShadowColor:[NSColor blackColor]];
[shadow setShadowBlurRadius:6.0];
[shadow setShadowOffset:NSMakeSize(0, 3)];
[shadow set];
NSRect shapeRect = NSMakeRect(0, 0, 256, 100);
[[NSColor redColor] set];
NSRectFill(shapeRect);
[image unlockFocus];
Этот код работает до определенной точки. Я могу подтвердить, что контекст действительно перевернут, потому что [[NSGraphicsContext currentContext] isFlipped]
возвращает YES
, а также потому, что shapeRect
рисуется в правильном положении (используя верхний левый угол в качестве источника). Тем не менее, NSShadow
, похоже, не учитывает перевернутый статус контекста. Установка смещения тени на (0, 3)
должна переместить тень вниз , когда контекст перевернут, но он фактически переместит его вверх (что происходит в стандартном неперевернутом контексте ).
Эта проблема кажется специфичной для -lockFocusFlipped
, потому что, когда я рисую, используя этот же код в CALayer
с перевернутой системой координат, тень рисуется очень хорошо (с учетом переворота). Документация по -lockFocusFlipped
также кажется довольно расплывчатой. Это все, что сказано в документации NSImage
класса:
Подготавливает изображение для получения команд рисования с использованием указанного перевернутого состояния.
И я также нашел это примечание в Замечаниях по выпуску Snow Leopard AppKit :
В некоторых случаях, например, при рисовании напрямую через NSLayoutManager, требуется перевернутый контекст. Чтобы покрыть этот случай, мы добавляем
- (void)lockFocusFlipped:(BOOL)flipped;
Это не изменяет состояние самого изображения, а только контекст, на котором заблокирован фокус. Это означает, что (0,0) вверху слева и положительное по оси Y внизу в заблокированном контексте.
Ни один из документов, по-видимому, не объясняет поведение NSShadow
в этом случае. И при дальнейшем тестировании кажется, что NSGradient
, похоже, не учитывает перевернутое состояние контекста рисования, используемого NSImage
.
Любое понимание высоко ценится: -)