Hidden Bar

Hidden Bar 是一款Macos下的软件应用,在使用Macos 的时候,当我们打开的软件越多以后,状态栏越来越长,越看也不对劲,我们怎么样管理好状态栏的图表,让Macos 的状态栏看起来清爽起来呢?

试试这款开源的软件,Hidden BarHidden Bar 使用的是swift编写,如果我们只想用这款软件,不在意编程的话,可以直接到Releases 中进行下载

从 Windows XP 开始,菜单栏就支持图标隐藏了,只是当时不能自定义,而是通过一个按钮来控制显示/隐藏。随着 Windows 7 的出现,菜单栏开始支持自定义图标的显示/隐藏,这个功能方便了有很多软件图标常驻菜单栏的用户,让用户不在因图标太多而分心、紧张、烦躁。对于 Mac 用户来说,Windows 的这项功能非常实用,然而到现在苹果公司也没有推出这一功能,但一些苹果开发者们做出了类似功能的 App,让 Mac 拥有和 Window 一样的隐藏菜单栏图标功能,

安装

软件直接是打包的dmg格式,直接安装就能够使用。

android WindowManager 隐藏状态栏 隐藏系统状态栏app_ide


android WindowManager 隐藏状态栏 隐藏系统状态栏app_ide_02


github 开源的开源地址在这里

当然也可以通过Homebrew 进行安装:

brew install --cask hiddenbar
使用

Hidden Bar 使用非常的简单,当我们安装完软件,直接拖动图标就可以更换位置,点击箭头的按钮就能够隐藏相关的图标,这样就能够用来管理状态栏的图标了。

Hidden Bar 是一款免费而且开源的工具,类似 Bartender 的菜单栏图标隐藏软件,按住 ⌘ 同时拖动软件 icon 到 Hidden Bar 的竖条 “|” 左侧,默认情况下这些软件 icon 就会隐藏起来,放在竖条 “|” 右侧和箭头的中间,会将软件 icon 排除在隐藏菜单里,点击箭头按钮即可进行“隐藏/显示”的动作。

android WindowManager 隐藏状态栏 隐藏系统状态栏app_github_03

使用的方法到这里就差不多了。

如果想知道里面的原理,可以看看具体的代码,按照惯例,还是把核心的代码放到这里:

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
        }
    }
}