Как я могу перерисовать изображение в пользовательском NSView для NSStatusItem?

У меня возникли некоторые проблемы с пониманием того, как связать пользовательский NSView для NSMenuItem, чтобы он поддерживал как анимацию, так и перетаскивание. У меня есть следующий подкласс NSView, выполняющий основную часть работы. Он рисует мой значок, когда приложение запускается правильно, но мне не удалось правильно настроить подпредставление для изменения, когда я вызываю функцию setIcon из другого вызывающего объекта. Есть ли какой-то элемент дизайна, который мне не хватает?

TrayIconView.m

#import "TrayIconView.h"

@implementation TrayIconView
@synthesize statusItem;
static NSImageView *_imageView;

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
      statusItem = nil;
      isMenuVisible = NO;
      _imageView = [[NSImageView alloc] initWithFrame:[self bounds]];
      [self addSubview:_imageView];
    }

    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
  // Draw status bar background, highlighted if menu is showing
  [statusItem drawStatusBarBackgroundInRect:[self bounds]
                              withHighlight:isMenuVisible];
}

- (void)mouseDown:(NSEvent *)event {
  [[self menu] setDelegate:self];
  [statusItem popUpStatusItemMenu:[self menu]];
  [self setNeedsDisplay:YES];
}

- (void)rightMouseDown:(NSEvent *)event {
  // Treat right-click just like left-click
  [self mouseDown:event];
}

- (void)menuWillOpen:(NSMenu *)menu {
  isMenuVisible = YES;
  [self setNeedsDisplay:YES];
}

- (void)menuDidClose:(NSMenu *)menu {
  isMenuVisible = NO;
  [menu setDelegate:nil];
  [self setNeedsDisplay:YES];
}

- (void)setIcon:(NSImage *)icon {
  [_imageView setImage:icon];
}

TrayIconView.h

#import <Cocoa/Cocoa.h>

@interface TrayIconView : NSView

{
  BOOL isMenuVisible;
}

@property (retain, nonatomic) NSStatusItem *statusItem;

- (void)setIcon:(NSImage *)icon;

@end

person apblardo    schedule 23.01.2013    source источник
comment
где создается элемент статуса?   -  person Samhan Salahuddin    schedule 24.01.2013
comment
попробуйте поместить setNeedsDisplay в setIcon... вряд ли это решит вашу проблему, но попробуйте.   -  person Samhan Salahuddin    schedule 24.01.2013


Ответы (1)


Решение этой проблемы фактически выходило за рамки представлений, подробно описанных здесь. Вызывающий интерфейс дважды создавался случайно, что обнуляло ссылку на ранее созданный NSView. После исправления этой проблемы приложение рисует и работает нормально.

Что касается перетаскивания, я только что реализовал подкласс NSView, который реализовал протокол перетаскивания Cocoa и добавил его в качестве подпредставления к этому родительскому классу. Это позволяет перетаскивать на текущий установленный NSRect, который содержит значок строки меню.

person apblardo    schedule 24.01.2013