Hidden Bar
是一款Macos下的软件应用,在使用Macos
的时候,当我们打开的软件越多以后,状态栏越来越长,越看也不对劲,我们怎么样管理好状态栏的图表,让Macos
的状态栏看起来清爽起来呢?
试试这款开源的软件,Hidden Bar
。Hidden Bar
使用的是swift
编写,如果我们只想用这款软件,不在意编程的话,可以直接到Releases
中进行下载。
从 Windows XP 开始,菜单栏就支持图标隐藏了,只是当时不能自定义,而是通过一个按钮来控制显示/隐藏。随着 Windows 7 的出现,菜单栏开始支持自定义图标的显示/隐藏,这个功能方便了有很多软件图标常驻菜单栏的用户,让用户不在因图标太多而分心、紧张、烦躁。对于 Mac 用户来说,Windows 的这项功能非常实用,然而到现在苹果公司也没有推出这一功能,但一些苹果开发者们做出了类似功能的 App,让 Mac 拥有和 Window 一样的隐藏菜单栏图标功能,
软件直接是打包的dmg
格式,直接安装就能够使用。
github 开源的开源地址在这里。
当然也可以通过Homebrew
进行安装:
brew install --cask hiddenbar
Hidden Bar
使用非常的简单,当我们安装完软件,直接拖动图标就可以更换位置,点击箭头的按钮就能够隐藏相关的图标,这样就能够用来管理状态栏的图标了。
Hidden Bar 是一款免费而且开源的工具,类似 Bartender 的菜单栏图标隐藏软件,按住 ⌘ 同时拖动软件 icon 到 Hidden Bar 的竖条 “|” 左侧,默认情况下这些软件 icon 就会隐藏起来,放在竖条 “|” 右侧和箭头的中间,会将软件 icon 排除在隐藏菜单里,点击箭头按钮即可进行“隐藏/显示”的动作。
使用的方法到这里就差不多了。
如果想知道里面的原理,可以看看具体的代码,按照惯例,还是把核心的代码放到这里:
func showHideSeparatorsAndAlwayHideArea() {
Preferences.areSeparatorsHidden ? self.showSeparators() : self.hideSeparators()
if self.isCollapsed {self.expandMenubar()}
}
private func showSeparators() {
Preferences.areSeparatorsHidden = false
if !self.isCollapsed {
self.btnSeparate.length = self.btnHiddenLength
}
self.btnAlwaysHidden?.length = self.btnAlwaysHiddenLength
}
private func hideSeparators() {
guard self.isBtnAlwaysHiddenValidPosition else {return}
Preferences.areSeparatorsHidden = true
if !self.isCollapsed {
self.btnSeparate.length = self.btnHiddenLength
}
self.btnAlwaysHidden?.length = self.btnAlwaysHiddenEnableExpandCollapseLength
}
func expandCollapseIfNeeded() {
//prevented rapid click cause icon show many in Dock
if isToggle {return}
isToggle = true
self.isCollapsed ? self.expandMenubar() : self.collapseMenuBar()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.isToggle = false
}
}
private func collapseMenuBar() {
guard self.isBtnSeparateValidPosition && !self.isCollapsed else {
autoCollapseIfNeeded()
return
}
btnSeparate.length = self.btnHiddenCollapseLength
if let button = btnExpandCollapse.button {
button.image = Assets.expandImage
}
if Preferences.useFullStatusBarOnExpandEnabled {
NSApp.setActivationPolicy(.accessory)
NSApp.deactivate()
}
}
private func expandMenubar() {
guard self.isCollapsed else {return}
btnSeparate.length = btnHiddenLength
if let button = btnExpandCollapse.button {
button.image = Assets.collapseImage
}
autoCollapseIfNeeded()
if Preferences.useFullStatusBarOnExpandEnabled {
NSApp.setActivationPolicy(.regular)
NSApp.activate(ignoringOtherApps: true)
}
}
private func autoCollapseIfNeeded() {
guard Preferences.isAutoHide else {return}
guard !isCollapsed else { return }
startTimerToAutoHide()
}
private func startTimerToAutoHide() {
timer?.invalidate()
self.timer = Timer.scheduledTimer(withTimeInterval: Preferences.numberOfSecondForAutoHide, repeats: false) { [weak self] _ in
DispatchQueue.main.async {
if Preferences.isAutoHide {
self?.collapseMenuBar()
}
}
}
}
private func getContextMenu() -> NSMenu {
let menu = NSMenu()
let prefItem = NSMenuItem(title: "Preferences...".localized, action: #selector(openPreferenceViewControllerIfNeeded), keyEquivalent: "P")
prefItem.target = self
menu.addItem(prefItem)
let toggleAutoHideItem = NSMenuItem(title: "Toggle Auto Collapse".localized, action: #selector(toggleAutoHide), keyEquivalent: "t")
toggleAutoHideItem.target = self
toggleAutoHideItem.tag = 1
NotificationCenter.default.addObserver(self, selector: #selector(updateAutoHide), name: .prefsChanged, object: nil)
menu.addItem(toggleAutoHideItem)
menu.addItem(NSMenuItem.separator())
menu.addItem(NSMenuItem(title: "Quit".localized, action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
return menu
}
private func updateAutoCollapseMenuTitle() {
guard let toggleAutoHideItem = btnSeparate.menu?.item(withTag: 1) else { return }
if Preferences.isAutoHide {
toggleAutoHideItem.title = "Disable Auto Collapse".localized
} else {
toggleAutoHideItem.title = "Enable Auto Collapse".localized
}
}
@objc func updateAutoHide() {
updateAutoCollapseMenuTitle()
autoCollapseIfNeeded()
}
@objc func openPreferenceViewControllerIfNeeded() {
Util.showPrefWindow()
}
@objc func toggleAutoHide() {
Preferences.isAutoHide.toggle()
}
}
//MARK: - Alway hide feature
extension StatusBarController {
private func setupAlwayHideStatusBar() {
NotificationCenter.default.addObserver(self, selector: #selector(toggleStatusBarIfNeeded), name: .alwayHideToggle, object: nil)
toggleStatusBarIfNeeded()
}
@objc private func toggleStatusBarIfNeeded() {
if Preferences.alwaysHiddenSectionEnabled {
self.btnAlwaysHidden = NSStatusBar.system.statusItem(withLength: 20)
if let button = btnAlwaysHidden?.button {
button.image = self.imgIconLine
button.appearsDisabled = true
}
self.btnAlwaysHidden?.autosaveName = "hiddenbar_terminate";
}else {
self.btnAlwaysHidden = nil
}
}
}