以前はNIBで作成され、NSMenuItemのビューとして割り当てられていたカスタムNSViewがあります。これはうまく機能しますが、今度は、ハードに見えないコードでビューを作成したいと思います(正当な理由で保証できます)。しかし、ビューは実際には描画されていません。
「setNeedsDisplay:」メッセージを送信しても、必要なときにビューを描画するために以前に呼び出されていた「drawRect:」メッセージが呼び出されなくなりました。
ビューを画像で初期化し、メニュー項目が適切なサイズであるために機能するように見えるサイズ(画像サイズに一致するようにビューの)を設定しますが、画像がありません。
ここで何が起こっているのでしょうか?
これは、ビューを初期化するためのコードです。
-(id)initWithImage:(NSImage*)image
{
self = [super init];
if (self != nil)
{
self.imageToDisplay = image;
// this bit does get called and resizes the view to match the image size
NSRect imageBounds = NSMakeRect(0.0f, 0.0f, imageToDisplay.size.width, imageToDisplay.size.height);
[self setBounds:imageBounds];
[self setFrame:imageBounds];
[self setHidden:NO];
[self setAlphaValue:1.0f];
[self setAutoresizesSubviews:YES];
}
return self;
}
そして、これは呼び出されないビューを描画するためのコードです
// this is never called
-(void)drawRect:(NSRect)dirtyRect
{
if (imageToDisplay == nil)
return;
NSRect imageBounds = NSMakeRect(0.0f, 0.0f, imageToDisplay.size.width, imageToDisplay.size.height);
[self setBounds:imageBounds];
[self setFrame:imageBounds];
[imageToDisplay drawInRect:[self bounds]
fromRect:imageBounds
operation:NSCompositeSourceAtop
fraction:1.0f];
}
そして、これはビューを追加するメニュー項目のコードです。
-(void)awakeFromNib
{
MyCustomView* view = [[MyCustomView alloc] init];
[self setView:view];
// i would have expected the image to get drawn at this point
[view setNeedsDisplay:YES];
}