2016-09-16 14 views
0

MacOS 10.12+、Xcode 8+、Swift 3:macOS 10.12+でNSTableViewヘッダーをカスタマイズする方法は?

NSTableViewヘッダーのフォントと描画をプログラムでカスタマイズしたいと思います。私はこれについて古い質問があることを知っていますが、私は今日働くものを見つけることができませんでした。

class MyHeaderCell: NSTableHeaderCell { 
    override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) { 
     NSLog("MyHeaderCell is drawing") 
     font = NSFont.boldSystemFont(ofSize: 12) 
     super.drawInterior(withFrame: cellFrame, in: controlView) 
    } 
} 

そして、私のテーブルビューにそのサブクラスを使用します:

は例えば、私は、カスタムフォントを設定するNSTableHeaderCellをサブクラス化しようとした

tableColumn.headerCell = MyHeaderCell() 

私はMyHeaderCellが描画されたメッセージ」を参照してください。 "がコンソールに表示されますが、表ヘッダーのフォントは変更されません。

+1

'attributedStringValue'を設定しようとしましたか? – Willeke

+0

@Willekeはい、attributedStringValueを設定しようとしました。私の設定は無視されました。 – sam

+1

@sam私のMyHeaderCellの実装では、 'attributedStringValue'を使って完全に動作します!だからあなたのコードに何か問題があると思う。あなたはいくつかのヒントを見つけることができます[ここ](http://stackoverflow.com/questions/32666795/how-do-i-override-layout-of-nstableheaderview) –

答えて

2

@HeinrichGiesenと@Willekeのコメントのおかげで、私はそれを働かせました。誰かを助ける場合に備えて私はここにそれを掲示しています。背景色をカスタマイズする私のやり方はそれほど柔軟ではないことに注意してください。私は実際にデフォルトの図面に色を塗っています。私の目的には十分です。

final class MyHeaderCell: NSTableHeaderCell { 

    // Customize background tint for header cell 
    override func draw(withFrame cellFrame: NSRect, in controlView: NSView) { 
     super.draw(withFrame: cellFrame, in: controlView) 
     NSColor(red: 0.9, green: 0.9, blue: 0.8, alpha: 0.2).set() 
     NSRectFillUsingOperation(cellFrame, .sourceOver) 
    } 

    // Customize text style/positioning for header cell 
    override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) { 
     attributedStringValue = NSAttributedString(string: stringValue, attributes: [ 
      NSFontAttributeName: NSFont.systemFont(ofSize: 11, weight: NSFontWeightSemibold), 
      NSForegroundColorAttributeName: NSColor(white: 0.4, alpha: 1), 
     ]) 
     let offsetFrame = NSOffsetRect(drawingRect(forBounds: cellFrame), 4, 0) 
     super.drawInterior(withFrame: offsetFrame, in: controlView) 
    } 
} 
関連する問題