Как применить пользовательский стиль к NSTableHeaderView?

#swift #macos #cocoa #nstableview #nstableviewheader

#swift #macos #какао #nstableview #nstableviewheader

Вопрос:

Итак, я выбираю пользовательский вид NSTableView. Я уже успешно подклассировал NSTableRowView и NSTextFieldCell добился желаемого внешнего вида, однако я изо всех сил пытаюсь избавиться от стиля по умолчанию для заголовка. Кажется, я могу настроить его фрейм, однако я не уверен, откуда берется остальная часть стиля по умолчанию.

Как вы видите на скриншоте, красная область — это увеличенный кадр headerView . Я использую его CALayer для установки цвета, однако как изменить содержимое внутри, мне неведомо…

введите описание изображения здесь

Вот что я делаю в viewDidLoad моем ViewController

 override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
    tableView.wantsLayer = true
    tableView.headerView?.frame = NSMakeRect(0, 0, (tableView.headerView?.frame.width)!, 32.00)
    tableView.headerView?.wantsLayer = true
    tableView.headerView?.layer?.backgroundColor = NSColor.red.cgColor
}
  

Я также пробовал подклассы NSTableHeaderView , однако этот класс кажется крайне ограниченным с точки зрения настроек, которые я могу сделать…

Любая помощь будет оценена?

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

1. Чего вы пытаетесь достичь?

2. @dscrown просто поместите «заголовок», который находится внутри красной области — серого прямоугольника с меткой «Цветовая палитра»… Я хочу настроить их. Я просто не знаю, как их настроить. :/ Или даже к какому классу они относятся.

Ответ №1:

Представление таблицы основано на представлении, но заголовок — нет, а ячейки заголовка по-прежнему являются классами NSTableHeaderCell . Используйте NSTableColumn свойство . headerCell Вы можете установить свойства ячейки, такие как attributedStringValue и backgroundColor или заменить ячейки экземплярами подкласса NSTableHeaderCell и переопределить один из методов рисования.

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

1. Теперь я все понял! Спасибо @Willeke. Для людей, которые оказались в одной лодке, дальнейший путь — назначить экземпляр подкласса NSTableHeaderCell headerCell свойству of NSTableColumn . По сути, у вас будет что-то вроде column.headerCell = MyCustomHeaderCell() . Вы просто переопределяете метод рисования в своем пользовательском классе ячеек заголовка и выполняете там свой пользовательский рисунок.

Ответ №2:

Поиграйте с этим, чтобы попасть внутрь заголовка.
Не забудьте исключить ответ, если он работает для вас.

 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    //Color for the  header.
    let topColor = UIColor(red: (70/255.0), green: 000/255.0, blue: 000/255.0, alpha: 255)

    //Location of label.
    let locationOfLabel = self.view.frame.width

    let headerView:UIView = UIView()

    //Locating the text in the label
    let title = UILabel(frame: CGRect(x: 0, y: 30, width: locationOfLabel, height: 21))
    title.textAlignment = .center

    //Changing the title in the label per the default.
    let defaults:UserDefaults = UserDefaults.standard
    defaults.synchronize()

    let cardSelector  = defaults.object(forKey: "selectorKeyID") as! Int
    switch (cardSelector) {
    case 0: title.text = "Personal"
    break
    case 1: title.text = "Saved"
    break
    case 2: title.text = "Favorite"
    break
    case 3: title.text = "Grouped"
    break
    default:
        break
    }
    //Coloring the text in the label
    //Add the label
    title.textColor = UIColor.gray

    headerView.addSubview(title)

    //Adding a button to the header.
    let closeBttn = UIButton(type: UIButtonType.system) as UIButton
    closeBttn.frame = CGRect(x: 0, y: 30, width: 90, height: 27)
    closeBttn.setTitle("Close", for: UIControlState())
    closeBttn.setTitleColor(buttonColor, for: UIControlState())
    closeBttn.titleLabel?.font = UIFont.systemFont(ofSize: 19, weight: UIFontWeightMedium)
    closeBttn.addTarget(self, action: #selector(MainTableViewController.close), for: UIControlEvents.touchUpInside)
    headerView.addSubview(closeBttn)

    let menuButton = UIButton(type: UIButtonType.system) as UIButton
    menuButton.frame = CGRect(x: locationOfLabel-53, y: 30, width: 27, height: 27)
    menuButton.setBackgroundImage(UIImage(named: "VBC Menu4.png"), for: UIControlState())
    menuButton.addTarget(self, action: #selector(MainTableViewController.menuButton), for: UIControlEvents.touchUpInside)
    headerView.addSubview(menuButton)

    //Coloring the header
    headerView.backgroundColor = topColor

    //Rounding the corners.
    headerView.layer.cornerRadius = 10
    headerView.clipsToBounds = true


    return headerView

}

 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 70.0
}
  

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

1. Это iOS, но вопрос касается macOS