2015-09-19 23 views
3

我想爲我的NSTableView產生一個自定義標題。我想更改標題文本的字體並刪除邊框和垂直分隔符。如何重寫NSTableHeaderView的佈局?

我現在的頂部和底部標題如下:

enter image description here

有誰知道我該怎麼做嗎?

UPDATE:應用此修復程序後的頭,現在看來,我打算:

enter image description here

回答

3

實際上,這兩個問題的答案從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) 
    } 
} 
+0

你在哪裏使用自定義'NSTableHeaderView(ForecastHeaderView)'。或者你在哪裏實現它,以便TableView使用這個自定義類。 – Codey

+0

當你通過InterfaceBuilder查看你的表格視圖時,你會看到一個滾動視圖對象,一個Clip VIew對象,實際的表格視圖和其中的列。與表視圖相同的級別是NSTableViewHeader對象。選擇它並將自定義類型更改爲「ForecastHeaderView」,或者任何自定義標題視圖類型。 –

+0

我想知道如果你有任何更新此代碼爲斯威夫特3.我已經試過你的代碼,一些API已經改變,它不編譯。我試圖找出它,但因爲圖層處理方式不同。我無法重寫drawLayer。我試圖通過擴展CALayer來找到解決方法,但我仍然無法實現它。 – Amir

1

您需要接管通過繼承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中將您的類的名稱設置爲您的子類的名稱。

+1

謝謝。我想我只是失去了一步。我的表只有一個NSTableHeaderView,我無法選擇TableHeaderCell以便能夠繼承它。 – iphaaw

3

一種方式做到這一點,在你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 
}