首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSStatusItem版本图标

NSStatusItem版本图标
EN

Stack Overflow用户
提问于 2013-05-13 20:27:27
回答 3查看 320关注 0票数 0

我有一个ARC项目,它包含一个自定义视图,它在单击状态栏图标后出现。我是编程新手,所以我从GitHub中拉出了this example project来启动和运行。该应用程序运行良好,唯一的问题是与状态栏项目。我按我应该的方式设置了NSStatusItem,但只要我调用setView,图标似乎就被释放了。我可以点击菜单栏中的空白处,打开应用程序,这样项目就会出现,只是图标不见了。(确认镜像有效)。我遗漏了什么?

下面是NSStatusItem代码:

代码语言:javascript
复制
//
//  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

下面是引用的menulet代码:

代码语言:javascript
复制
//
//  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
EN

回答 3

Stack Overflow用户

发布于 2013-05-13 20:50:52

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

此信息可在文档中找到,此处为:NSStatusItem class reference

注意:

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

票数 3
EN

Stack Overflow用户

发布于 2013-05-13 21:17:26

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

代码语言:javascript
复制
@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
票数 -1
EN

Stack Overflow用户

发布于 2013-05-13 21:29:05

我回到了GitHub代码库的原始代码,尽管我从别人那里学到的不是很漂亮,但只做了一点小小的调整。感谢大家的帮助,我现在知道该为V2做些什么了。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16522036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档