繁体   English   中英

NSStatusItem发布图标

[英]NSStatusItem releases icon

我有一个涉及自定义视图的ARC项目,该项目在单击状态栏图标后出现。 我是编程的新手,因此我从GitHub提取了此示例项目以启动并运行。 该应用程序运行良好,唯一的问题是状态栏项目。 我应该设置NSStatusItem,但是一旦调用setView,该图标似乎就会被释放。 我可以在菜单栏中单击空白区域,以打开应用程序,以便该项目在那里,只是缺少该图标。 (确认图像有效)。 我想念什么?

这是NSStatusItem代码:

//
//  WOMAppDelegate.m
//  PopoverMenulet
//
//  Created by Julián Romero on 10/26/11.
//  Copyright (c) 2011 Wuonm Web Services S.L. All rights reserved.
//

#import "WOMAppDelegate.h"
#import "WOMMenulet.h"
#import "WOMController.h"

@implementation WOMAppDelegate

@synthesize window = _window;
@synthesize menulet;
@synthesize statusItem;
@synthesize statusImage;
@synthesize controller;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    //SET UP NSSTATUSITEM
    statusImage = [NSImage imageNamed:@"basket"];
    self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [self.statusItem setImage:statusImage];
    //[self.statusItem setHighlightMode:YES];
    [self.statusItem setEnabled:YES];

    self.menulet = [[WOMMenulet alloc] init]; /* square item */
    self.controller = [[WOMController alloc] init];
    self.menulet.delegate = controller;
    [self.statusItem setView:menulet];
}
@end

这是引用的菜单代码:

//
//  WOMMenulet.m
//  PopoverMenulet
//
//  Created by Julián Romero on 10/26/11.
//  Copyright (c) 2011 Wuonm Web Services S.L. All rights reserved.
//

#import "WOMMenulet.h"

static void *kActiveChangedKVO = &kActiveChangedKVO;

@implementation WOMMenulet

@synthesize delegate;

- (void)setDelegate:(id<WOMMenuletDelegate>)newDelegate
{
[(NSObject *)newDelegate addObserver:self forKeyPath:@"active" options:NSKeyValueObservingOptionNew context:kActiveChangedKVO];
delegate = newDelegate;
}

- (void)mouseDown:(NSEvent *)event {
[self.delegate menuletClicked];
}

#pragma mark - KVO

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == kActiveChangedKVO) {
    //NSLog(@"%@", change);
    [self setNeedsDisplay:YES];
   }
}

@end

setImage仅在调用状态或NSStatusItem的默认视图有效- setView:您正在设置要在菜单栏中显示的自定义视图。 如果您希望在菜单栏中有一个图像,则此自定义视图应自行绘制图像。

此信息可在以下文档中找到: NSStatusItem类参考

注意:

讨论设置自定义视图将覆盖NSStatusItem定义的所有其他外观和行为设置。 自定义视图负责绘制自身并提供其自己的行为,例如处理鼠标单击和发送操作消息。

该视图将绘制您在项目上设置的内容

@interface DDQuickMenuStatusItemView : NSView
@property(weak) NSStatusItem *item;
//...
@end


@implementation DDQuickMenuStatusItemView

//...

- (void)drawRect:(NSRect)dirtyRect {
    NSImage *image = nil;
    if(self.item) {
        [self.item drawStatusBarBackgroundInRect:self.bounds withHighlight:NO];
        image = self.item.image;
    }

    if(image) {
        NSRect r = self.bounds;
        r.size = [image size];
        r = [self.class centerRect:r inRect:self.bounds];
        r = [self centerScanRect:r];
        [image drawInRect:r fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
    }
}

#pragma mark -

+ (CGRect)centerRect:(CGRect)rect inRect:(CGRect)inRect
{
    CGRect result = rect;
    result.origin.x = inRect.origin.x + (inRect.size.width - result.size.width)*0.5f;
    result.origin.y = inRect.origin.y + (inRect.size.height - result.size.height)*0.5f;
    return result;
}

@end

我回到了GitHub存储库中的原始代码,尽管我从其他人那里学到的东西还不算很漂亮,但还是做了些微调整。 感谢您的帮助,我现在知道V2的处理方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM