Я использую метод -lockFocusFlipped:
NSImage
для рисования изображения. Мой код выглядит так:
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
.
Любое понимание очень ценится :-)