Контекст:
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:
?