#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
перекрывает представление заголовка. Я попытался добавить пользовательский цвет фона, но содержимое по-прежнему перекрывает заголовок.
Я попытался использовать пользовательский 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()