본문 바로가기

iOS/macOS

[Swift : MacOS] MAC statusbar 어플리케이션을 만들어보자

300x250

기본적으로 MAC OS 어플리케이션을 만들면 statusbar(이하 상태바)에 표시되지 않고 storyboard에 있는 화면이 새 창으로 뜨게된다.

statusbar에서도 컨트롤 가능한 어플리케이션을 만드려면 몇 가지 작업을 해주어야한다.

 

1. Appdelegate NSStatusItem 설정

먼저, Appdelegate에서 NSStatusItem 변수를 추가한다.

그 다음 applicationDidFinishLaunching 메써드 안에 NSStatusItem 설정을 해준다.

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    private var statusItem: NSStatusItem!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }
}

· variableLength : 컨텐츠 길이에 따라 statusItem의 길이가 달라짐

· squareLength : 상태바에 맞게 컨텐츠가 조정됨

 

2. StatusItem Button 설정

statusItem이 상태바에 나타나고 해당 statusItem을 이용하기 위해서는 nstatusItem에 button을 달아주어야 한다.

또한 상태바가 꽉 차있을경우 어플리케이션이 실행되도 상태바에 나타나지 않을 수 있으므로 이에대한 처리를 해준다.

func applicationDidFinishLaunching(_ aNotification: Notification) {
        statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
        guard let statusBtn = statusItem?.button else {
            let answer = showAlert(title: "Status bar is Full !", contents: "Restart after removing some status bar App.")
            print(answer)
            NSApp.terminate(self) //status bar is full -> quit app
            return
        }
}

· NSApp.terminate(self) : 앱 종료

 

상태바가 꽉 차있을경우 경고창을 띄우고 앱을 종료한다.

경고창을 띄우는 showAlert()함수는 다음과 같다.

경고창에 확인 버튼만 넣어놓고 취소버튼은 주석처리 해두었다. 필요할 경우 주석을 해제하고 원하는 옵션을 추가하면 된다.

import AppKit

func showAlert(title: String, contents: String) -> Bool {
    let alert = NSAlert()
    alert.messageText = title
    alert.informativeText = contents
    alert.alertStyle = .warning
    alert.addButton(withTitle: "OK")
    //alert.addButton(withTitle: "Cancel")
    return alert.runModal() == .alertFirstButtonReturn
}

 

이제 statusButton에 표시될 내용을 넣어준다.

 statusBtn.title = "StatusApp"

//statusBtn.image = NSImage(named: NSImage.Name(@ImageName))
//statusBtn.imagePosition = .imageLeft

타이틀에는 텍스트를 넣어주면 해당 텍스트가 상태바에 나타나고

.image를 사용해 이미지를 넣을수도 있다.

또한 타이틀과 이미지를 모두 넣을수도있는데 이때는 .imagePosition을 사용해 타이틀과 이미지의 배치를 정할 수 있다.

 

이 후 실행을 하면 다음과 같이 상태바에 실행된 어플리케이션을 볼 수 있다.

 

상태바에 나타난 어플리케이션

3. NSMenu 추가

statusButton을 클릭했을 때 메뉴가 나타나게 하기 위해서는 NSMenu를 추가해주어야 한다.

NSMenu()를 선언해주고 menu.addItem 메써드를 사용해서 메뉴 아이템을 추가한다.

각 메뉴아이템은 action(클릭시 실행될 이벤트), keyEquivalent(단축키 실행)을 추가할 수 있다.

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    private var statusItem: NSStatusItem!
    private let menu = NSMenu()

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
        guard let statusBtn = statusItem?.button else {
            let answer = showAlert(title: "Status bar is Full !", contents: "Restart after removing some status bar App.")
            print(answer)
            NSApp.terminate(self) //status bar is full -> quit app
            return
        }
        statusBtn.title = "StatusApp"
        
        menu.addItem(NSMenuItem(title: "첫번째 메뉴", action: nil, keyEquivalent: ""))
        menu.addItem(NSMenuItem.separator())
        menu.addItem(NSMenuItem(title: "두번째 메뉴", action: nil, keyEquivalent: ""))
        statusItem.menu = menu
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }
}

 

이제 statusButton을 클릭하면 추가한 메뉴들이 나타난다.

 

statusButton 클릭시 menuItem이 나타남

 

320x100