我的工作,有一个自定义的应用程序NSView
上NSStatusBar
,当用户点击它执行所有的绘图.但这就是问题,我正在绘制的颜色,因为视图的背景颜色与系统蓝色不同.
我的应用程序的颜色:
Twitter的菜单项颜色(系统):
你清楚地看到,我的蓝色比系统轻.这是我目前使用的代码(并且在比Yosemite更早的版本上完美运行):
[[NSColor selectedMenuItemColor] set];
NSRectFill(rect);
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过挑选菜单项的颜色,但似乎颜色受到菜单栏下方壁纸的影响.
关于如何实现系统的任何想法看起来?
在OSX 10.10 beta 3中,Apple发布了他们的暗色调选项.不幸的是,这也意味着几乎所有的状态栏图标(除了我见过的Apple和Path Finder),包括我的,都在黑暗的背景下保持黑暗.如何在应用深色调时提供替代图像?
我没有看到API更改NSStatusBar
或NSStatusItem
显示我的更改,我假设它是一个通知或一些反应,以便在用户改变色调时轻松进行更改.
绘制图像的当前代码包含在NSView
:
- (void)drawRect:(NSRect)dirtyRect
{
// set view background color
if (self.isActive) {
[[NSColor selectedMenuItemColor] setFill];
} else {
[[NSColor clearColor] setFill];
}
NSRectFill(dirtyRect);
// set image
NSImage *image = (self.isActive ? self.alternateImage : self.image);
_imageView.image = image;
}
Run Code Online (Sandbox Code Playgroud) 我正在制作一个位于状态栏的应用程序.单击状态项时,将弹出NSPopover.
它看起来像这样:
这就是问题所在:我希望它是"瞬态的",即如果我点击弹出窗口外的任何地方,它就会关闭.虽然当弹出窗口在窗口中时NSPopoverBehaviorTransient正常工作,但当它在状态栏中时它不起作用.
我怎样才能自己实现这种行为?
几个月后我没有做任何事情,我开始回到可可开发.最初我开始使用Snow Leopard和Xcode 3.我现在正在使用Xcode 4.2运行Lion,我遇到了一些我之前没遇到过的问题.
我相信这可能是因为我之前从未使用过ARC,所以我肯定我错过了一些东西.
我正在尝试创建状态栏应用程序,没有主窗口或停靠图标.当我运行应用程序时,我的应用程序的状态栏图标会短暂显示,大约一秒钟,但随后消失.
继承我的代码.
QuickPlusAppDelegate.h
#import <Cocoa/Cocoa.h>
@interface QuickPlusAppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@property (assign) NSStatusItem *statusItem;
@property (weak) IBOutlet NSMenu *statusItemMenu;
@property (strong) NSImage *statusItemIcon;
@property (strong) NSImage *statusItemIconHighlighted;
@property (strong) NSImage *statusItemIconNewNotification;
@end
Run Code Online (Sandbox Code Playgroud)
QuickPlusAppDelegate.m
#import "QuickPlusAppDelegate.h"
@implementation QuickPlusAppDelegate
@synthesize statusItemMenu = _statusItemMenu;
@synthesize window = _window, statusItem = _statusItem;
@synthesize statusItemIcon = _statusItemIcon,
statusItemIconHighlighted = _statusItemIconHighlighted,
statusItemIconNewNotification = _statusItemIconNewNotification;
- (void) awakeFromNib
{
NSBundle *appBundle = [NSBundle mainBundle];
_statusItemIcon = [[NSImage …
Run Code Online (Sandbox Code Playgroud) 你们都知道Mac OS X中的菜单栏(或更好的NSStatusBar).
我可以移动一些项目,而其他项目则不行.
我希望能够拖动我的应用程序的NSStatusItem.
知道如何实现这个吗?
NSStatusItem
在我将它添加到Cocoa的状态栏后,是否有可能得到一个框架?当我的应用程序启动时,我将一个项目添加到系统状态栏,并想知道它的位置,是可能的.
由于小牛每个屏幕都有自己的状态栏.这也意味着在状态栏中运行的应用程序(使用NSStatusItem)理论上有多个NSStatusItem对象关联.实际上,虽然用户可能会看到NSStatusItem的多个"实例",但它只是一个(我已经测试过了).现在,当您在状态图标中使用自定义视图时会出现以下问题:当用户单击状态图标时,我使用drawStatusBarBackgroundInRect方法以编程方式"突出显示"它.问题是状态图标的每个"实例"(每个屏幕一个)都会突出显示,尽管用户只是点击了一个.此行为与没有自定义视图的状态图标不同.有没有办法正确实现这个?
举个好例子,只需在使用多个显示器时点击Dropbox状态图标即可.你会注意到在另一个屏幕上选择了图标.
我正在寻找一种方法来检测何时NSStatusBarButton
右键单击(使用Swift)并调用操作.
我目前正在这样设置:
let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-1)
func applicationDidFinishLaunching(aNotification: NSNotification) {
// Insert code here to initialize your application
if let button = statusItem.button {
button.image = NSImage(named: "myImage")
button.alternateImage = NSImage(named: "myImage")
button.action = Selector("myAction")
}
}
Run Code Online (Sandbox Code Playgroud)
我想过使用button.rightMouseDown(<#theEvent: NSEvent#>)
(因为没有这样的"alternateAction"),但不幸的是,由于我刚开始编写Mac应用程序,我无法想出一些东西.
更新:
在寻找一种方法时,我看到一些线程告诉子类a,
NSView
但我不知道它应该如何工作(这可能是因为我对编程很新,甚至不知道如何"子类").我仍然认为有一些更简单的方法可以使用它,因为statusBar
我所知道的几乎所有应用程序都依赖于右键.
我正在尝试使用 SwiftUI 2.0(应用程序结构)中引入的 SwiftUI 应用程序生命周期创建一个菜单栏应用程序,其中 SwiftUI 代码中的按钮和操作将更新状态栏项目的文本。我正在创建一个状态栏项目,它将触发一个包含 SwiftUI 视图的弹出窗口。根据我的理解,最好的方法是将 statusBar 传递给 ContentView 的子级,后者将能够使用 statusBar 作为环境对象。但是,我遇到一个我不明白的问题,即在应用程序委托中工作的代码在 SwiftUI 2.0 init 函数中失败(不清楚原因)。我希望我已将下面所有相关的代码包含在一个单独的示例中,以触及问题的核心。
我有一个工作解决方案,使用NSApplicationDelegateAdaptor
statusBar 在 ContentView 之前初始化,并且 statusBar 只是作为环境对象传递到 ContentView:
import SwiftUI
import AppKit
@main
struct test_status_bar_appApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
Settings{
EmptyView()
}
}
}
class AppDelegate: NSObject, NSApplicationDelegate {
var popover = NSPopover.init()
var statusBar: StatusBarController?
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Create the Status Bar Item with the Popover
statusBar = StatusBarController.init(popover)
// …
Run Code Online (Sandbox Code Playgroud) 我有一个动态添加NSMenuItems的NSMenu.NSMenu在保持打开状态时不能正常刷新.我正在调用NSMenu更新方法NSEventTrackingRunLoopModes
.
我已经实现了以下方法来更新NSMenu.
- (void)menuNeedsUpdate:(NSMenu *)menu {
for (NSInteger index = 0; index < count; index++)
[self menu:menu updateItem:[menu itemAtIndex:index]
atIndex:index
shouldCancel:NO];
}
- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel`
- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu
Run Code Online (Sandbox Code Playgroud) nsstatusbar ×10
cocoa ×7
macos ×4
nsstatusitem ×4
objective-c ×3
nsmenu ×2
nsmenuitem ×2
osx-yosemite ×2
swift ×2
nscolor ×1
osx-lion ×1
popover ×1
statusbar ×1
swiftui ×1