Не удается переопределить поведение draw () NSTableViewRow, чтобы сделать прозрачным в NSOutlineView
У меня есть NSOutlineView с пользовательских NSTableViewRows, используемых повсюду.
Я переопределил метод рисования на NSTableViewRow:
override func draw(_ dirtyRect: NSRect) {}
... поэтому он никогда не должен ничего рисовать. Тем не менее, строки иногда сплошные черные, а иногда чистые. Я не могу выработать образец, когда.
Если я добавлю что-то в функцию рисования, она будет рисовать поверх черного, когда это произойдет, я не могу очистить черный в функции рисования, кроме как заливкой сплошным цветом.
Чтобы очистить я попытался:
let context = NSGraphicsContext.current?.cgContext
context?.clear(dirtyRect)
а также
NSColor.clear.setFill()
dirtyRect.fill(using: .copy)
Если я загляну в иерархию Debug View, я отчетливо вижу, что это черный цвет самого NSTableViewRow.
Я попытался установить wantLayer и установить backgroundColor слоя в функции рисования, но это не имеет никакого эффекта.
Может кто-нибудь объяснить, откуда эта черная заливка и откуда она живет!
Единственный способ, которым мне удалось убедиться, что его там не было, это использовать:
override var wantsUpdateLayer: Bool { get { return true } }
... что говорит о том, что NSTableViewRow делает что-то немного странное.
3 ответа
(скопировано из комментариев теперь, когда мы обнаружили обходной путь)
В документации для NSTableRowView говорится, что он "отвечает за отображение атрибутов, связанных со строкой, включая выделение выделения и просмотр строки группы". Таким образом, базовый класс представления строки явно что-то делает, и табличное представление, вероятно, делает предположения об этом, и я бы предположил, что это сложно и высоко оптимизировано.:(
Обходной путь будет называть super.draw(dirtyRect)
в вашем draw(_:NSRect)
просто чтобы база NSTableRowView
класс делает любую внутреннюю магию, которая ему нужна, а затем стирает все, что нарисовал, и рисует над этим.
Я действительно подумал о, возможно, менее хакерском решении: добавить непрозрачное подпредставление к NSTableRowView
что полностью заполняет его bounds
и нарисуйте все, что вы пытаетесь нарисовать в этом подпредставлении.
Подкласс NSTableRowView добавить переопределение isOpaque
Быстрый:
override var isOpaque: Bool {
get {
return false
}
set {
}
}
Obj-C:
- (BOOL)isOpaque {
return NO;
}
Учтите, что рисунков много. Нравиться:
override func drawBackground(in dirtyRect: NSRect) {
override func drawSelection(in dirtyRect: NSRect) {
override func drawSeparator(in dirtyRect: NSRect) {
and more...