#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
свойству ofNSTableColumn
. По сути, у вас будет что-то вроде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