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.
}
Эта проблема:
Если я использую -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 ответ
В -[NSButtonCell layoutLayerWithFrame:inView:]
клетка добавляет NSTextField
нарисовать заголовок. Override titleRectForBounds:
и вернуться NSZeroRect
удалить заголовок.