DSFDockTile

轻松地将图像、动画、徽章和提醒显示到您的 macOS 应用程序的 Dock 图标上。

Swift Package Manager

为什么?

我受到了 Neil Sardesai 在 Twitter 上发布 这个帖子 的启发。还有 Norbert M. Doerner 发布的精彩后续推文。

虽然 NSDockTile API 不是很复杂,但我想要一些可以轻松更改 Dock 图标的图像,甚至可以从 GIF 图像等添加基本动画的东西。

特性

默认情况下,DSFDockTile 实例作用于应用程序的 Dock 图标。您可以通过调用徽章生成器上的 init 函数,为任何窗口提供您自己的 NSDockTile(通过调用 window.dockTile)。

DockTile 插件

您是否知道您的应用程序即使在未运行时也可以显示自定义的 DockTile 图像? Apple 提供了 NSDockTilePlugin 协议,允许您完全做到这一点。想要为暗黑和浅色模式提供不同的应用程序图标? NSDockTilePlugin 允许您这样做! 想要在应用程序未运行时调整 Dock 图标,但需要关注? NSDockTilePlugin

Demos 文件夹中有一个演示应用程序,名为'DSFDockTile Plugin Demo' (macOS 11+),演示了在 SwiftUI 中使用 NSDockTilePluginDSFDockIcon

集成

Swift Package Manager

https://github.com/dagronf/DSFDockTile 添加到您的项目中。

如果您不想包含 DSFImageFlipbook 包,请复制 Sources/ 文件夹中的所有文件,**除了** DSFDockTile+Animation.swift

演示

Demos 子文件夹中有一个演示 macOS 应用程序可用。

徽章标签

将徽章标签添加到 Dock 图标非常容易。

// Set the label on the docktile to 1234
DSFDockTile.badgeLabel = "1234"

// Remove the badge label from the docktile
DSFDockTile.badgeLabel = nil

DockTile 生成器

AppIcon

将 Dock 图标设置为应用程序的图标。

// Set the dock icon to the application icon
DSFDockTile.AppIcon.display()

常量图像

这是一个 DSFDockTile 对象,显示单个图像。如果您有一组要在 Dock 图标中显示的图像,这些图像不会更改,并且您想要保持其不变性,则此方法很有用。

static let LockedImage   = NSImage(named: NSImage.Name("padlock-locked"))!
static let UnlockedImage = NSImage(named: NSImage.Name("padlock-unlocked"))!

let LockedDockTileImage = DSFDockTile.ConstantImage(LockedImage)
let UnlockedDockTileImage = DSFDockTile.ConstantImage(UnlockedImage)
...

if application.isEditable {
   UnlockedDockTileImage.display()
}
else {
   LockedDockTileImage.display()
}

图像

这是一个可以显示图像的 DSFDockTile 对象。

static let LockedImage   = NSImage(named: NSImage.Name("padlock-locked"))!
static let UnlockedImage = NSImage(named: NSImage.Name("padlock-unlocked"))!

let stateDockTile = DSFDockTile.Image()

...

func viewDidLoad() {
   let image = application.isEditable ? UnlockedImage : LockedImage
   stateDockTile.display(image)
}

视图

这是一个 DSFDockTile 对象,可以显示由视图控制器管理的视图的内容

由于 NSDockTile 的限制,视图不会在视图更新时实时绘制到 Dock 中。每当视图中发生更改时,您必须调用 display() 以使用视图的当前内容更新 Dock 图标。

/// The view controller to display on the docktile
let dockViewController = DockViewController()

/// The docktile instance handling the docktile
lazy var updateDockTile: DSFDockTile.View = {
   dockViewController.loadView()
   return DSFDockTile.View(dockViewController)
}()
...
func doUpdate() {
   // Change the color of the item in the 
   self.dockViewController.foregroundColor = .systemYellow

   // NSDockTile does not update automatically so need to tell it when changes are made
   self.updateDockTile.display()
}

动画

这是一个可以显示动画的 Dock 图标。它在底层使用 DSFImageFlipbook 来处理动画本身。

let animatedDockTile: DSFDockTile.Animated = {
   let fb = DSFImageFlipbook()
   let da = NSDataAsset(name: NSDataAsset.Name("animated-gif"))!
   _ = fb.loadFrames(from: da.data)
   return DSFDockTile.Animated(fb)
}()

...

@IBAction func startAnimating(_ sender: Any) {
   animatedDockTile.startAnimating()
}

@IBAction func stopAnimating(_ sender: Any) {
   animatedDockTile.stopAnimating()
}

SwiftUI

DockTile 视图用于操作以下对象的 Dock 图标:

您可以在 DockTile 视图的初始化程序中设置要更新哪个 Dock 图标

更新徽章

要使用 SwiftUI 设置徽章,请使用 DockTile 视图并为徽章提供标签

@State var badgeLabel: String = ""
var body: some Scene {
   WindowGroup {
      ZStack {
         ContentView()
         DockTile(label: badgeLabel)
      }
   }
}

更新内容

要设置 Dock 图标的内容,请向初始化程序提供一个视图。 设置为 nil 可将 Dock 图标恢复为默认值。

@State var dockText: String = ""
var body: some Scene {
   WindowGroup {
      ZStack {
         ContentView()
         DockTile(
            .window,
            label: "3",
            content: ZStack {
               Color.white
               Text(dockText)
            }
         )
      }
   }
}

请记住,DockTile API 不提供实时 Dock 图标更新,并且需要您为想要进行的每个视觉更改更新视图

注意概念

如果您的应用程序不是最前面的应用程序,您可以通过应用程序的 DockTile 请求用户信息。

有关更多详细信息,请参阅 Apple 的文档

requestInformationalAttention()

请求 Dock 图标“弹跳”以告知用户一些信息。 该函数返回一个对象,您可以使用该对象取消注意力请求。

let cancellable = DSFDockTile.requestInformationalAttention()

cancellable 可用于取消信息请求。

请参阅 Apple 的文档

requestCriticalAttention()

请求 Dock 图标“弹跳”以告知用户一些信息。 该函数返回一个对象,您可以使用该对象取消注意力请求。

let cancellable = DSFDockTile.requestCriticalAttention()

cancellable 可用于取消关键请求。

请参阅 Apple 的文档

取消协议 (DSFDockTileUserAttentionCancellation)

用户注意方法返回一个符合 DSFDockTileUserAttentionCancellation 的对象,该对象可用于取消注意请求。

请参阅 Apple 的文档

感谢

许可

MIT。 随意使用它,只要注明我的作品即可。 如果您确实在某处使用了它,请告诉我,我很乐意听取您的意见!

MIT License

Copyright (c) 2022 Darren Ford

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.