ごちゃごちゃメニューバーはもう卒業!macOSエンジニアのための「Ice」徹底解説
Jordan Baird/Ice は、macOSのメニューバーを管理するための強力なツールです。たくさんのアプリをインストールしていると、メニューバーのアイコンが増えすぎて見にくくなりがちですよね。そんな時にIceが活躍します。まるで魔法のように、メニューバーをスッキリと整理し、必要な時だけアイコンを表示させることができます。
メニューバーの整理は、ただ見た目をきれいにするだけではありません。ソフトウェア開発の効率を上げる上でも非常に重要です。
集中力の向上
開発中は、できるだけ集中したいものです。たくさんのアイコンが並んでいると、視覚的なノイズとなり集中力が途切れがちになります。Iceを使えば、必要なアイコンだけを表示させ、不要なアイコンは非表示にできるため、集中してコードを書くことができます。
スクリーンキャストやプレゼンでの活用
開発したアプリのデモやプレゼンテーションを行う際、メニューバーがごちゃごちゃしていると、プロフェッショナルな印象を与えにくいことがあります。Iceでアイコンを整理しておけば、デモ画面をクリーンで洗練された状態に保てます。
開発効率の改善
Macのメニューバーアイコンは、アプリのステータスを表示していることが多いです。例えば、ビルドの進捗やCI/CDの状態など。これらの情報を効率的に管理し、必要な時にすぐにアクセスできるようにすることは、開発ワークフローの最適化につながります。
ちょっとしたコント風に、Iceの導入を想像してみましょうか。
A先輩
「おい、最近やたらとメニューバーアイコンが増えてきて、ビルドのステータスが見にくくて仕方がないんだよなぁ...」
B後輩
「先輩、それ、"闇バイト"ですよ! 」
A先輩
「え? 闇バイト?」
B後輩
「はい。次々と知らないうちにメニューバーに居座るアイコンたちに、大事な"見やすさ"という資産を奪われているんです! いますぐやめさせないと、いずれ...」
A先輩
「...おいおい、なんか話が物騒だな。どうしたらいいんだ?」
B後輩
「任せてください! そんな闇バイトアイコンたちをクリーンアップする、合法で強力なツールがあるんです! それが Ice です!」
A先輩
「お、それだ! 頼む!」
Iceは、増えすぎたメニューバーアイコンという「闇バイト」を合法的に整理してくれる、エンジニアの強い味方というわけです。
Iceはオープンソースプロジェクトなので、直接GitHubからダウンロードするか、Homebrew を使って簡単にインストールできます。
Homebrewを使う場合
brew install --cask ice
このコマンドを実行するだけで、Homebrewが自動的にIceをダウンロードし、インストールしてくれます。
GitHubからダウンロードする場合
GitHubリポジトリ(jordanbaird/Ice)にアクセスします。
最新のリリース版(Releases)から .dmg ファイルをダウンロードします。
ダウンロードしたファイルを開き、Ice.app を「アプリケーション」フォルダにドラッグ&ドロップします。
これでインストールは完了です!
Iceを起動すると、メニューバーに新しいアイコンが表示されます。
アイコンをドラッグ&ドロップ
Iceが提供する特別な仕切りアイコン(通常はパイプ | や点線)を境に、アイコンをドラッグ&ドロップして並べ替えができます。
非表示エリア
一定のエリアを設けて、そこにアイコンをドラッグすると、普段は非表示になり、必要な時だけ表示されるようになります。
Iceはメニューバー管理アプリですが、Swift開発者として、Iceと連携するようなアプリをどう作るか、またはIceのコンセプトをどう取り入れるか考えてみましょう。
以下は、メニューバーにアイコンを追加し、クリックするとメニューが表示される、基本的なmacOSアプリのサンプルコードです。Iceのようなツールと組み合わせることで、このアイコンをより効率的に管理できます。
import SwiftUI
@main
struct MyApp: App {
@StateObject private var menuBarManager = MenuBarManager()
var body: some Scene {
Settings {
// アプリの設定ウィンドウなど
Text("設定")
}
}
}
class MenuBarManager: NSObject, ObservableObject {
private var statusItem: NSStatusItem!
override init() {
super.init()
setupMenuBar()
}
private func setupMenuBar() {
// メニューバーアイコンを生成
statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
// アイコンの画像を設定
if let button = statusItem.button {
// ここにオリジナルのアイコン画像をセット
button.image = NSImage(systemSymbolName: "hammer.fill", accessibilityDescription: nil)
button.action = #selector(showMenu)
}
}
@objc func showMenu() {
// クリックした時に表示されるメニュー
let menu = NSMenu()
menu.addItem(NSMenuItem(title: "こんにちは!", action: nil, keyEquivalent: ""))
menu.addItem(NSMenuItem(title: "設定", action: #selector(openSettings), keyEquivalent: ""))
menu.addItem(NSMenuItem.separator())
menu.addItem(NSMenuItem(title: "終了", action: #selector(NSApplication.shared.terminate(_:)), keyEquivalent: "q"))
statusItem.menu = menu
// メニューを表示
statusItem.button?.performClick(nil)
statusItem.menu = nil
}
@objc func openSettings() {
NSApp.sendAction(Selector(("showSettingsWindow:")), to: nil, from: nil)
}
}
このコードで作成したメニューバーアプリは、Iceを使えば好きな位置に配置したり、一時的に非表示にしたりできます。これは、開発者として、自分のアプリが他のユーザーのメニューバー体験を損なわないようにするための配慮でもあります。