swift - 带有图标的 macOS 菜单栏文本
问题描述
正如您在图像中看到的那样,我希望能够做一个类似的,以创造一种方式,而不是只显示太阳的图标,还显示一个文本。
如下图所示,一个图标后跟一个文本。
但我只能做到这一点:
问题我想把图标放在文字的左边或右边,而不是上面,你能帮帮我吗?
附言
文本必须相应更改,我怎样才能使StatusBarController
接收文本更改。
import AppKit
import SwiftUI
class StatusBarController {
@ObservedObject var userPreferences = UserPreferences.instance
private var statusBar: NSStatusBar
private var statusItem: NSStatusItem
private var popover: NSPopover
init(_ popover: NSPopover) {
self.popover = popover
statusBar = NSStatusBar.init()
statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
if let statusBarButton = statusItem.button {
if let _ = userPreferences.$inDownload {
statusItem.button?.title = userPreferences.$percentualDownload
}
statusBarButton.image = #imageLiteral(resourceName: "Weather")
statusBarButton.image?.size = NSSize(width: 18.0, height: 18.0)
statusBarButton.image?.isTemplate = true
statusBarButton.action = #selector(togglePopover(sender:))
statusBarButton.target = self
statusBarButton.imagePosition = NSControl.ImagePosition.imageLeft
}
}
@objc func togglePopover(sender: AnyObject) {
if(popover.isShown) {
hidePopover(sender)
}
else {
showPopover(sender)
}
}
func showPopover(_ sender: AnyObject) {
if let statusBarButton = statusItem.button {
popover.show(relativeTo: statusBarButton.bounds, of: statusBarButton, preferredEdge: NSRectEdge.maxY)
}
}
func hidePopover(_ sender: AnyObject) {
popover.performClose(sender)
}
}
我正在考虑使用类似的东西:
import EventKit
import ServiceManagement
private struct PreferencesKeys {
static let backgroundIsTransparent = "backgroundIsTransparent"
static let inDownload = "inDownload"
static let percentualDownload = "percentualDownload"
}
class UserPreferences: ObservableObject {
static let instance = UserPreferences()
private init() {
// This prevents others from using the default '()' initializer for this class.
}
private static let defaults = UserDefaults.standard
@Published var backgroundIsTransparent: Bool = {
guard UserDefaults.standard.object(forKey: PreferencesKeys.backgroundIsTransparent) != nil else {
return true
}
return UserDefaults.standard.bool(forKey: PreferencesKeys.backgroundIsTransparent)
}() {
didSet {
UserPreferences.defaults.set(backgroundIsTransparent, forKey: PreferencesKeys.backgroundIsTransparent)
}
}
@Published var inDownload: Bool = {
guard UserDefaults.standard.object(forKey: PreferencesKeys.inDownload) != nil else {
return true
}
return UserDefaults.standard.bool(forKey: PreferencesKeys.inDownload)
}() {
didSet {
UserPreferences.defaults.set(inDownload, forKey: PreferencesKeys.inDownload)
}
}
@Published var percentualDownload: String = {
guard UserDefaults.standard.object(forKey: PreferencesKeys.percentualDownload) != nil else {
return "0%"
}
return UserDefaults.standard.string(forKey: PreferencesKeys.percentualDownload)!
}() {
didSet {
UserPreferences.defaults.set(percentualDownload, forKey: PreferencesKeys.percentualDownload)
}
}
}
但我收到以下错误:
编辑:
我使用的第一个问题解决了:
statusBarButton.imagePosition = NSControl.ImagePosition.imageLeft
statusBarButton.imagePosition = NSControl.ImagePosition.imageRight
对于更新文本问题,我该怎么办?
解决方案
推荐阅读
- javascript - 使用 unshift() 添加数据时获得漂亮的 chart.js 动画?
- javascript - 如何在 Nativescript 和普通 JS 中禁用 iOS 捏缩放和双击缩放
- oop - 我们是否应该始终使用工厂而不是使用“new”关键字创建对象?
- jquery - 如何修复 jquery 滑块库中的不透明度
- node.js - DynamoDB:获取数组每个项目的属性
- jquery - 如何使用自定义 div 元素在 Jquery 中显示工具提示
- drools - Drools:如何比较两个列表中的属性的最佳实践
- c++ - 如何阻止函数的内存泄漏
- oop - API 或包装器不是应用程序的边界吗?
- python - 如何使用请求库自动化浏览器(不是硒导致性能)