我想爲我的NSTableView產生一個自定義標題。我想更改標題文本的字體並刪除邊框和垂直分隔符。如何重寫NSTableHeaderView的佈局?
我現在的頂部和底部標題如下:
有誰知道我該怎麼做嗎?
UPDATE:應用此修復程序後的頭,現在看來,我打算:
我想爲我的NSTableView產生一個自定義標題。我想更改標題文本的字體並刪除邊框和垂直分隔符。如何重寫NSTableHeaderView的佈局?
我現在的頂部和底部標題如下:
有誰知道我該怎麼做嗎?
UPDATE:應用此修復程序後的頭,現在看來,我打算:
實際上,這兩個問題的答案從mprudhom和普羅託很好地促成了最終的修復。非常感謝你們兩位。
我想我會發布我的最終答案,所以任何後續的人都可以看到我如何修復它。
我無法單獨使用mprudhom的代碼,因爲我的表只有NSTableHeaderView而沒有TableHeaderCells。幸運的Pronto來對救援:
class MyTable: NSTableView, NSTableViewDataSource, NSTableViewDelegate
{
override func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?
{
tableColumn!.headerCell = MyTableHeaderCell(textCell: tableColumn!.identifier)
}
}
我直接使用NSTableHeaderCell代碼mprudhom:
final class MyTableHeaderCell : NSTableHeaderCell
{
required init?(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
override init(textCell: String)
{
super.init(textCell: textCell)
self.font = NSFont.boldSystemFontOfSize(14)
}
override func drawWithFrame(cellFrame: NSRect, inView controlView: NSView)
{
//super.drawWithFrame(cellFrame, inView: controlView)//, since that is what draws borders
self.drawInteriorWithFrame(cellFrame, inView: controlView)
}
override func drawInteriorWithFrame(cellFrame: NSRect, inView controlView: NSView)
{
let titleRect = self.titleRectForBounds(cellFrame)
self.attributedStringValue.drawInRect(titleRect)
}
}
一旦這兩種方法付諸實施,我曾在該NSTableHeaderView最後一個問題,提請沒有邊界的要求,但確實有一個灰色的背景。所以我用這種方法覆蓋了NSTableHeaderView類:
class ForecastHeaderView : NSTableHeaderView
{
required init?(coder: NSCoder)
{
super.init(coder: coder)
}
override init(frame frameRect: NSRect)
{
super.init(frame: frameRect)
self.wantsLayer = true
}
override func drawLayer(layer: CALayer, inContext ctx: CGContext)
{
super.drawLayer(layer, inContext: ctx)
layer.backgroundColor = CGColorCreateGenericGray(1.0, 1.0)
}
}
您需要接管通過繼承NSTableHeaderCell
,像這樣畫自己:
final class CustomTableHeaderCell : NSTableHeaderCell {
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override init(textCell: String) {
super.init(textCell: textCell)
self.font = NSFont.boldSystemFontOfSize(20)
}
override func drawWithFrame(cellFrame: NSRect, inView controlView: NSView) {
// skip super.drawWithFrame(), since that is what draws borders
self.drawInteriorWithFrame(cellFrame, inView: controlView)
}
override func drawInteriorWithFrame(cellFrame: NSRect, inView controlView: NSView) {
let titleRect = self.titleRectForBounds(cellFrame)
self.attributedStringValue.drawInRect(titleRect)
}
}
如果您以編程方式設置表格,您可以這樣做:
let col = NSTableColumn(identifier: id)
col.headerCell = DataTableHeaderCell(textCell: title)
col.title = title
self.dataTableView.addTableColumn(col)
否則,您應該能夠在Interface Builder中將您的類的名稱設置爲您的子類的名稱。
謝謝。我想我只是失去了一步。我的表只有一個NSTableHeaderView,我無法選擇TableHeaderCell以便能夠繼承它。 – iphaaw
一種方式做到這一點,在你NSTableViewDelegate's
- 功能:
if tableColumn!.identifier == "description" {
let cell = NSTableHeaderCell()
cell.title = "New Title"
cell.backgroundColor = NSColor.redColor()
cell.drawsBackground = true
cell.bordered = false
cell.font = NSFont(name: "Helvetica", size: 16)
tableColumn!.headerCell = cell
}
你在哪裏使用自定義'NSTableHeaderView(ForecastHeaderView)'。或者你在哪裏實現它,以便TableView使用這個自定義類。 – Codey
當你通過InterfaceBuilder查看你的表格視圖時,你會看到一個滾動視圖對象,一個Clip VIew對象,實際的表格視圖和其中的列。與表視圖相同的級別是NSTableViewHeader對象。選擇它並將自定義類型更改爲「ForecastHeaderView」,或者任何自定義標題視圖類型。 –
我想知道如果你有任何更新此代碼爲斯威夫特3.我已經試過你的代碼,一些API已經改變,它不編譯。我試圖找出它,但因爲圖層處理方式不同。我無法重寫drawLayer。我試圖通過擴展CALayer來找到解決方法,但我仍然無法實現它。 – Amir