NSControl на уровне слоя все еще вызывает процедуры рисования NSCell

Контекст:

У 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. 
}

Эта проблема:

Если я использую -updateLayerNSCell по-прежнему получает команды рисования и рисует свой заголовок, что приводит к "размытой" строке заголовка в моем элементе управления, потому что строка рисуется дважды - один раз в моем 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 ответ

Решение

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

Другие вопросы по тегам