标签: nsstatusbar

如何访问系统选择的菜单项蓝色?

我的工作,有一个自定义的应用程序NSViewNSStatusBar,当用户点击它执行所有的绘图.但这就是问题,我正在绘制的颜色,因为视图的背景颜色与系统蓝色不同.

我的应用程序的颜色:
在此输入图像描述

Twitter的菜单项颜色(系统):
在此输入图像描述

你清楚地看到,我的蓝色比系统轻.这是我目前使用的代码(并且在比Yosemite更早的版本上完美运行):

[[NSColor selectedMenuItemColor] set];
NSRectFill(rect);
Run Code Online (Sandbox Code Playgroud)

我甚至尝试过挑选菜单项的颜色,但似乎颜色受到菜单栏下方壁纸的影响.
关于如何实现系统的任何想法看起来?

nsmenu nsmenuitem nscolor nsstatusbar osx-yosemite

29
推荐指数
1
解决办法
612
查看次数

NSStatusItem更改暗色调的图像

在OSX 10.10 beta 3中,Apple发布了他们的暗色调选项.不幸的是,这也意味着几乎所有的状态栏图标(除了我见过的Apple和Path Finder),包括我的,都在黑暗的背景下保持黑暗.如何在应用深色调时提供替代图像?

我没有看到API更改NSStatusBarNSStatusItem显示我的更改,我假设它是一个通知或一些反应,以便在用户改变色调时轻松进行更改.

绘制图像的当前代码包含在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)

macos objective-c nsstatusitem nsstatusbar osx-yosemite

23
推荐指数
2
解决办法
1万
查看次数

弹出窗口处于状态栏时的NSPopover过渡

我正在制作一个位于状态栏的应用程序.单击状态项时,将弹出NSPopover.

它看起来像这样:

在此输入图像描述

这就是问题所在:我希望它是"瞬态的",即如果我点击弹出窗口外的任何地方,它就会关闭.虽然当弹出窗口在窗口中时NSPopoverBehaviorTransient正常工作,但当它在状态栏中时它不起作用.

我怎样才能自己实现这种行为?

cocoa statusbar popover nsstatusbar osx-lion

17
推荐指数
2
解决办法
4091
查看次数

NSStatusItem在启动时会短暂出现,但会立即消失

几个月后我没有做任何事情,我开始回到可可开发.最初我开始使用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)

cocoa objective-c nsstatusbar automatic-ref-counting

11
推荐指数
1
解决办法
2955
查看次数

如何拖动NSStatusItems

你们都知道Mac OS X中的菜单栏(或更好的NSStatusBar).
我可以移动一些项目,而其他项目则不行.

我希望能够拖动我的应用程序的NSStatusItem.

知道如何实现这个吗?

cocoa drag-and-drop nsstatusbar

10
推荐指数
2
解决办法
1536
查看次数

如何获取NSStatusItem的框架

NSStatusItem在我将它添加到Cocoa的状态栏后,是否有可能得到一个框架?当我的应用程序启动时,我将一个项目添加到系统状态栏,并想知道它的位置,是可能的.

cocoa nsstatusitem nsstatusbar

9
推荐指数
3
解决办法
3360
查看次数

Mavericks和NSStatusItem的自定义视图,带有多个监视器

由于小牛每个屏幕都有自己的状态栏.这也意味着在状态栏中运行的应用程序(使用NSStatusItem)理论上有多个NSStatusItem对象关联.实际上,虽然用户可能会看到NSStatusItem的多个"实例",但它只是一个(我已经测试过了).现在,当您在状态图标中使用自定义视图时会出现以下问题:当用户单击状态图标时,我使用drawStatusBarBackgroundInRect方法以编程方式"突出显示"它.问题是状态图标的每个"实例"(每个屏幕一个)都会突出显示,尽管用户只是点击了一个.此行为与没有自定义视图的状态图标不同.有没有办法正确实现这个?

举个好例子,只需在使用多个显示器时点击Dropbox状态图标即可.你会注意到在另一个屏幕上选择了图标.

macos cocoa nsstatusitem nsstatusbar osx-mavericks

8
推荐指数
2
解决办法
1193
查看次数

右键单击NSStatusBarButton时调用Action

我正在寻找一种方法来检测何时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我所知道的几乎所有应用程序都依赖于右键.

macos cocoa nsstatusitem nsstatusbar swift

7
推荐指数
1
解决办法
1692
查看次数

如何在 SwiftUI 应用程序生命周期中将 statusBar 传递给 popover 中的 contentView?

我正在尝试使用 SwiftUI 2.0(应用程序结构)中引入的 SwiftUI 应用程序生命周期创建一个菜单栏应用程序,其中 SwiftUI 代码中的按钮和操作将更新状态栏项目的文本。我正在创建一个状态栏项目,它将触发一个包含 SwiftUI 视图的弹出窗口。根据我的理解,最好的方法是将 statusBar 传递给 ContentView 的子级,后者将能够使用 statusBar 作为环境对象。但是,我遇到一个我不明白的问题,即在应用程序委托中工作的代码在 SwiftUI 2.0 init 函数中失败(不清楚原因)。我希望我已将下面所有相关的代码包含在一个单独的示例中,以触及问题的核心。

我有一个工作解决方案,使用NSApplicationDelegateAdaptorstatusBar 在 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)

macos nsstatusbar swift swiftui

7
推荐指数
1
解决办法
730
查看次数

如何在NSMenu打开时更新它?

我有一个动态添加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)

cocoa objective-c nsmenu nsmenuitem nsstatusbar

6
推荐指数
2
解决办法
2875
查看次数