[Swift/Cocoa] 背景色を設定できるNSViewのサブクラスのサンプル

2018年7月1日(更新: 2018年7月11日)

NSView に背景色を設定したい場合は、そのサブクラスを作り、メソッドをオーバーライドしてコードを変更します。

今回は、背景色を変えられる NSView の作り方と、それを利用したサンプルアプリを紹介します。

サンプルアプリのコード

Cocoa Application のプロジェクトを新規作成し、生成された ViewController.swift を以下のように変更します。

import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // 背景色のあるNSView
        let colorView = ColorView(
                frame: CGRect(x: 100, y: 100, width: 200, height: 200), 
                color: NSColor.green
        )
        self.view.addSubview(colorView)
        
        // 子要素となるテキストフィールド
        let textField = NSTextField(string: "これは背景色付きのNSView")
        textField.sizeToFit()
        textField.frame.origin = NSPoint(x: 20, y: 20)
        colorView.addSubview(textField)
    }
}

// 背景色を設定可能なNSView
class ColorView: NSView {
    
    var backgroundColor: NSColor?
    
    init(frame: NSRect, color: NSColor) {
        super.init(frame: frame)
        backgroundColor = color
    }
    
    required init?(coder decoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        
        if let color = backgroundColor {
            color.setFill()
            dirtyRect.fill()
        }
    }
}

NSView を継承して、背景色(backgroundColor)を設定できるようにしたクラスが ColorView です。

このクラスの中では、色(NSColor)を取得できるコンストラクタを追加し、さらに NSView のメソッドである draw(_ dirtyRect: NSRect) をオーバーライドして、背景色を描画する処理を追加しています。

サンプルの実行結果

以下のように、背景色が追加された NSView の子要素として NSTextField が表示されます。

背景色付きのNSView

以上、背景色を設定できる NSView のサブクラスのサンプルでした。

コメントを残す

メールアドレスが公開されることはありません。