跳至主要內容

lookAtMe

pptg大约 1 分钟

为什么要做这个?

有的时候上班不太忙,晚上到点打卡就下班 正好路过女朋友的单位,想一块吃个饭再回家 但是她可能在努力coding,没及时看消息,导致错过了 于是乎,就想弄一个直接在桌面弹出来的消息通知小工具

哈哈,被老妹盗了,拿去参加什么创意大赛了

1. 整体介绍

灵感,源自于Lyricsopen in new window,一款Mac的桌面歌词显示插件。 这个真是让我一整个大震惊,居然能在Mac上显示悬浮的内容!

整体的交互就比较简单了:

  • 客户端(Mac):Swift写的,支持桌面悬浮
  • 服务端:Golang写的,Redis维护倒计时的逻辑
  • 交互:如果有急时的话,把倒计时请求推到服务端,服务端再发给客户端。客户端先在Menu倒计时,如果在倒计时结束之后还没有操作的话,就会弹出桌面提醒。

2. 效果

悬浮在所有的window之上,切换window、dock也可以展示

效果1
效果1
效果2
效果2

3. 核心代码

实际上Mac的悬浮代码,核心就这么点。

class AppDelegate: NSObject, NSApplicationDelegate {
    var floatingWindow: NSWindow!
    
    func applicationDidFinishLaunching(_ notification: Notification) {
        // 隐藏Dock
        NSApp.setActivationPolicy(.accessory)
        // 创建悬浮窗口
        createFloatingWindow()
        // 启动轮询服务
        PollingService.shared.startPolling()
    }
    
    func createFloatingWindow() {
        // 固定窗口尺寸
        floatingWindow = NSWindow(
            contentRect: NSRect(x: 0, y: 0, width: 120, height: 120),
            styleMask: [.borderless, .fullSizeContentView],
            backing: .buffered,
            defer: false
        )
        
        let hostingController = NSHostingController(
            rootView: FloatingButton()
                .environmentObject(CountdownManager.shared)  // 添加环境对象注入
        )
        
        floatingWindow.contentViewController = hostingController
        configureWindow()
    }
    
    private func configureWindow() {
        floatingWindow.isOpaque = false
        floatingWindow.backgroundColor = .clear
        floatingWindow.level = .floating
        floatingWindow.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
        
        // 设置固定位置
        if let screen = NSScreen.main {
            floatingWindow.setFrameOrigin(NSPoint(
                x: -10,
                y: screen.visibleFrame.maxY - 700
            ))
        }
        
        // 显示在最前面
        floatingWindow.orderFrontRegardless()
    }
}