LoginSignup
12
11

More than 5 years have passed since last update.

NSTableRowView と NSTableCellView

Posted at

構造

NSTableRowView と NSTableCellView は NSView-based NSTableView / NSOutlineView で使われるビューです。NSTableRowView は行全体、NSTableCellView は行列で見たときのセルにあたります。



https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TableView/TableViewOverview/TableViewOverview.html

ハイライトカラー

行のハイライトカラーは規定ものが適用されており、システム環境設定のアピアランスで指定した強調表示色に依存しています。
Capture 2016-05-27 22.56.43.png

行のハイライトカラーはウインドウの選択状態にも依存します。ウインドウがアクティブである時は強調表示色になりますが、インアクティブの時にはグレーになります。
Capture 2016-05-27 23.22.40.png
ウインドウがアクティブ
Capture 2016-05-27 23.22.52.png
ウインドウがインアクティブ

またこれらの色は NSColor でも得られます。

NSColor
// ウインドウがアクティブで、行が選択されている時の色
alternateSelectedControlColor()
// ウインドウがインアクティブで、行が選択されている時の色
secondarySelectedControlColor()

ハイライトカラーの変更

Cocoa Touch (iOS) では UITableViewCell の backgroundView だとかを使って色を変更しますが、Cocoa ではちょっと面倒くさいです。NSTableRowView のサブクラスで drawSelectionInRect(dirtyRect:) をオーバーライドしてベジェパスで色を塗りつぶします。

MyTableRowView.swift
import Cocoa

class MyTableRowView: NSTableRowView {
    override func drawSelectionInRect(dirtyRect: NSRect) {
        // ここではハイライトスタイルを Regular に限定している
        if selectionHighlightStyle == .Regular {
            if selected == true {
                if emphasized == true {
                    // ウインドウがアクティブ状態
                    NSColor(red: 0.188, green: 0.514, blue: 0.985, alpha: 1.0).set()
                    var fillRect = bounds
                    fillRect.size.height -= 1
                    NSBezierPath.fillRect(fillRect)
                    return
                }
                //else {
                    // ウインドウがインアクティブの状態
                //}
            }
        }

        super.drawSelectionInRect(dirtyRect)
    }
}
NSOutlineViewDelegate
extension ViewController: NSOutlineViewDelegate {
func outlineView(outlineView: NSOutlineView, rowViewForItem item: AnyObject) -> NSTableRowView? {
        let identifier = "Row"
        var rowView = outlineView.makeViewWithIdentifier(identifier, owner: self) as? MyTableRowView
        if rowView == nil {
            rowView = MyTableRowView(frame: NSZeroRect)
            rowView!.identifier = identifier
        }

        return rowView
    }
}

ハイライトカラーを青色にしてみた例。

Capture 2016-05-27 23.23.23.png

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11