0

アニメーションとドラッグ アンド ドロップの両方をサポートするために、NSMenuItem のカスタム NSView を配線する方法を理解するのに苦労しています。ジョブの大部分を処理する 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
4

1 に答える 1

0

この問題の解決策は、実際にはここで説明するビューの外にありました。インターフェイスの呼び出し元が誤って二重にインスタンス化されたため、以前に作成された NSView への参照が無効になりました。その懸念を修正した後、アプリは正常に描画され、機能します。

ドラッグに関しては、Cocoa のドラッグ可能なプロトコルを実装する NSView のサブクラスを実装し、この親クラスにサブビューとして追加しました。これにより、メニューバー アイコンを含む現在確立されている NSRect にドラッグできます。

于 2013-01-24T14:44:35.787 に答える