NSControl с поддержкой слоев все еще вызывает процедуры рисования NSCell - PullRequest
0 голосов
/ 11 июня 2018

Контекст:

Apple имеет "мягко устаревший" NSCell на macOS.Я пытаюсь уменьшить его использование в своих пользовательских подклассах NSControl и вместо этого использую CALayers для обработки моего рисунка.Для этого я создаю слой подкласса NSButton на уровне слоя:

self.wantsLayer = YES;

И затем я пытаюсь обработать свой рисунок, используя путь "updateLayer" вместо "drawRect":

- (BOOL) wantsUpdateLayer {
    return YES;
}

- (void) updateLayer { 
     // Change layer background/border colors if pressed, disabled, etc.
     // Change text color of a CATextLayer sublayer for button's title. 
}

Проблема:

Если я использую -updateLayer, NSCell по-прежнему получает команды рисования и рисует свой заголовок, в результате чего в моем элементе управления появляется «размытая» строка заголовка, поскольку строка рисуется дважды -один раз в моем textLayer и один раз в ячейке.

Если, однако, я выполняю ту же работу, что и выше в -drawRect: вместо -updateLayer, то ячейка НЕ ​​рисует (потому что я нене вызывайте его с помощью [self.cell drawInteriorWithFrame:ControlView:])

Я не могу понять, что заставляет меня рисовать ячейку, когда соответствующий controlView (мой подкласс кнопок) выбрал -updateLayer вместо-drawRect:.

Я рассмотрел все методы в NSControl.h и NSView.h.Я переопределил все -updateCell и связанные методы.Никто из них не является виновником.Я не могу просто установить self.cell=nil, потому что NSControl все еще полагается на NSCell для обработки событий и т. Д.

Может кто-нибудь сказать мне, как остановить рисование NSCell, когда связанный с ним controlView использует -updateLayer вместо -drawRect:?

1 Ответ

0 голосов
/ 16 июня 2018

В -[NSButtonCell layoutLayerWithFrame:inView:] в ячейку добавляется NSTextField для рисования заголовка.Переопределите titleRectForBounds: и верните NSZeroRect, чтобы удалить заголовок.

...