読者です 読者をやめる 読者になる 読者になる

Cocoa API解説(macOS/iOS)

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。

目次

不定形のウインドウ(四角くないウインドウ)[Mac][Swift]

コラム NSWindow NSPanel

Swiftで、透明バックのウインドウの作り方

タイトルバー無しでウインドウを作成

var aWindow : NSPanel
        = NSPanel(contentRect: NSMakeRect(0.0, 0.0, 300.0, 200.0),
            styleMask: NSBorderlessWindowMask,
            backing: .Buffered,
            defer: false,
            screen: NSScreen.mainScreen())

バックグラウンドカラーをclearColorにセット

aWindow.backgroundColor = NSColor.clearColor()

opaqueをfalseに

aWindow.opaque = false

これで、ウインドウ(パネル)の背景が透過されてたうえ、配置しているUIパーツは透明にならない。

NSImageView等に背景を透明化できるPNGなどの画像を貼る。

        var theView : NSImageView = NSImageView(frame: NSMakeRect(0.0, 0.0, 300.0, 200.0))
        theView.image = NSImage(named: "IMG_6698")!
        aWindow.contentView.addSubview(theView)


タイトルバーを隠すので、移動は自分でやらないと行けないのだけど、マウスイベントが上手く取れない。
NSEventのlocationがうまく値を返してこないようで、実装できず。descriptionでログ出せばloc=(123.23,102.43)のように出てくるんだけどなあ。(OS X 10.10.2時点)
キャスト方法間違っていただけだった。


Transparent - YouTube

サンプルコード

Swift

    //NSWindow invalidateShadow
    @IBAction func function015(sender: AnyObject) {
        var aWindow : NSPanel
        = NSPanel(contentRect: NSMakeRect(0.0, 0.0, 300.0, 200.0),
            styleMask: NSBorderlessWindowMask,
                //| NSMiniaturizableWindowMask
                //| NSClosableWindowMask,
            
            backing: .Buffered,
            defer: false,
            screen: NSScreen.mainScreen())
        windowArray.addObject(aWindow) //ウインドウを保持するための配列に追加。アプリ終了時に配列は破棄
        aWindow.backgroundColor = NSColor.clearColor()
        aWindow.level = 1000
        aWindow.opaque = false
        
        var theView : NSImageView = NSImageView(frame: NSMakeRect(0.0, 0.0, 300.0, 200.0))
        theView.image = NSImage(named: "IMG_6698")!
        aWindow.contentView.addSubview(theView)
        aWindow.center()//ウインドウをスクリーンの中心に
        aWindow.orderFront(self)//前面に
        aWindow.makeKeyAndOrderFront(self)//表示
        
    }
更新時のバージョン

OS X 10.10