Не удается переопределить поведение 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...
Другие вопросы по тегам