我有一个ARC项目,它包含一个自定义视图,它在单击状态栏图标后出现。我是编程新手,所以我从GitHub中拉出了this example project来启动和运行。该应用程序运行良好,唯一的问题是与状态栏项目。我按我应该的方式设置了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下面是引用的menulet代码:
//
// 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发布于 2013-05-13 20:50:52
setImage只对NSStatusItem的默认视图有效,只要您调用- setView:,您就设置了一个要在菜单栏中显示的自定义视图。如果您希望在菜单栏中显示图像,则此自定义视图应自行绘制图像。
此信息可在文档中找到,此处为:NSStatusItem class reference
注意:
讨论设置自定义视图将覆盖NSStatusItem定义的所有其他外观和行为设置。自定义视图负责绘制自身并提供自己的行为,例如处理鼠标单击和发送操作消息。
发布于 2013-05-13 21:17:26
此视图将仅绘制您在项目上设置的内容
@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发布于 2013-05-13 21:29:05
我回到了GitHub代码库的原始代码,尽管我从别人那里学到的不是很漂亮,但只做了一点小小的调整。感谢大家的帮助,我现在知道该为V2做些什么了。
https://stackoverflow.com/questions/16522036
复制相似问题