轻松地将图像、动画、徽章和提醒显示到您的 macOS 应用程序的 Dock 图标上。
我受到了 Neil Sardesai 在 Twitter 上发布 这个帖子 的启发。还有 Norbert M. Doerner 发布的精彩后续推文。
虽然 NSDockTile API 不是很复杂,但我想要一些可以轻松更改 Dock 图标的图像,甚至可以从 GIF 图像等添加基本动画的东西。
默认情况下,DSFDockTile
实例作用于应用程序的 Dock 图标。您可以通过调用徽章生成器上的 init
函数,为任何窗口提供您自己的 NSDockTile
(通过调用 window.dockTile
)。
您是否知道您的应用程序即使在未运行时也可以显示自定义的 DockTile 图像? Apple 提供了 NSDockTilePlugin
协议,允许您完全做到这一点。想要为暗黑和浅色模式提供不同的应用程序图标? NSDockTilePlugin
允许您这样做! 想要在应用程序未运行时调整 Dock 图标,但需要关注? NSDockTilePlugin
!
在 Demos
文件夹中有一个演示应用程序,名为'DSFDockTile Plugin Demo' (macOS 11+),演示了在 SwiftUI 中使用 NSDockTilePlugin
和 DSFDockIcon
。
将 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
将 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()
}
DockTile
视图用于操作以下对象的 Dock 图标:
.application
)DockTile
视图的窗口 (.window
)您可以在 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 的文档。
请求 Dock 图标“弹跳”以告知用户一些信息。 该函数返回一个对象,您可以使用该对象取消注意力请求。
let cancellable = DSFDockTile.requestInformationalAttention()
cancellable
可用于取消信息请求。
请参阅 Apple 的文档
请求 Dock 图标“弹跳”以告知用户一些信息。 该函数返回一个对象,您可以使用该对象取消注意力请求。
let cancellable = DSFDockTile.requestCriticalAttention()
cancellable
可用于取消关键请求。
请参阅 Apple 的文档
用户注意方法返回一个符合 DSFDockTileUserAttentionCancellation
的对象,该对象可用于取消注意请求。
请参阅 Apple 的文档
演示应用程序中的图像(亮/暗)要感谢 brgfx 在 freepix 上
这是我用来理解如何将 NSDockTilePlugin
用于我自己的项目的项目。 https://github.com/rrroyal/AutomaticDockTile
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.