Пользовательский NSTableHeaderView не перекрывает ячейки при прокрутке

#swift #cocoa #nstableview

Вопрос:

Я пытаюсь создать пользовательский NSTableHeaderView интерфейс с минимальным стилем.

Это мой текущий код:

 public class RoundedTableHeaderView2 : NSTableHeaderView {  private let dividerHeight: CGFloat = 6.0    public override func draw(_ dirtyRect: NSRect)  {  // Bottom Line  NSColor.secondaryLabelColor.set()  let path = NSBezierPath()  path.lineWidth = .lineWidth / 2.0  path.move(to: NSPoint(x: 0.0, y: self.bounds.height - .lineWidth))  path.line(to: NSPoint(x: self.bounds.width, y: self.bounds.height - .lineWidth))  path.stroke()    guard let tableView = self.tableView else { return }    // Columns  for index in 0 ..lt; tableView.numberOfColumns  {  let column = tableView.tableColumns.at(index)    let basicString = column.headerCell.stringValue  let alignment = column.headerCell.alignment   let paraStyle = NSMutableParagraphStyle()  paraStyle.alignment = alignment    let font = NSFont.systemFont(ofSize: 11.0, weight: .semibold)    let attributes: [NSAttributedString.Key : Any] = [  NSAttributedString.Key.font : font,  NSAttributedString.Key.paragraphStyle: paraStyle,  .foregroundColor : NSColor.secondaryLabelColor,  ]    let textBounds = TextUtilities.measureSize(basicString, NSSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude), font)  let attributedString = NSMutableAttributedString(string: basicString, attributes: attributes)    let frame = tableView.rect(ofColumn: index).insetBy(dx: 8.0, dy: textBounds.height / 2.0)  attributedString.draw(in: frame)    if index == 0 { continue }    // Draw column dividers.  self.drawDivider(frame)  }  }    // MARK: - Helper  fileprivate func drawDivider(_ frame: NSRect)  {  NSColor.secondaryLabelColor.set()    let path = NSBezierPath(rect: NSRect(x: frame.minX - 8.0, y: self.bounds.height / 2.0 - self.dividerHeight / 2.0, width: .lineWidth, height: self.dividerHeight))    path.fill()  } }  

Что приводит к следующему результату:

Результат

Мне очень нравится результат, однако, если я начну прокручивать, содержимое NSTableView перекрывает представление заголовка. Я попытался добавить пользовательский цвет фона, но содержимое по-прежнему перекрывает заголовок.

Ячейки, перекрывающие NSTableHeaderView

Я попытался использовать пользовательский NSTableHeaderCell вместо пользовательского NSTableHeaderView, но результат тот же. Вот код моего мобильного:

 final class CustomTableHeaderCell : NSTableHeaderCell {  override init(textCell: String)  {  super.init(textCell: textCell)  self.font = NSFont.boldSystemFont(ofSize: 10)  }   required init(coder: NSCoder)  {  fatalError("init(coder:) has not been implemented")  }   override func draw(withFrame cellFrame: NSRect, in controlView: NSView)  {  // skip super.drawWithFrame(), since that is what draws borders  self.drawInterior(withFrame: cellFrame, in: controlView)  }   override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView)  {  let titleRect = self.titleRect(forBounds: cellFrame)  self.attributedStringValue.draw(in: titleRect)  } }  

Изменение цвета фона на что-то вроде красного рисует цвет, но ячейки по-прежнему перекрывают ячейки заголовка.

Что я здесь упускаю?

Комментарии:

1. Находятся ли представления ячеек перед представлением заголовка? Как вы добавили цвет фона?

2. Представления ячеек действительно находятся перед представлением заголовка, я не знаю почему. В этой draw функции я добавил следующий код для рисования цвета фона: NSColor.red.setFill(); NSBezierPath(rect: self.bounds).fill()