3

以前は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];
}
4

1 に答える 1

1

frameビューを設定する前に、ビューを設定する必要がありboundsます。-init...で、2つの呼び出しを交換するか、(とにかくデフォルトで設定されている)をset...削除すると、すべてが機能するはずです。また、設定をやり直す必要はないと思います。実際、フォーカスがすでにビューにロックされているときに、これらを変更するのは悪い考えのようです。値が実際に異なる場合、せいぜい奇妙な点滅が発生します。setBounds:bounds{(0,0), (frame.size.width, frame.size.height)}frameboundsdrawRect

更新: Viewプログラミングガイドでこのメモを見たばかりです:

:アプリケーションがsetBounds ...メソッドのいずれかを使用してビューの境界矩形を明示的に設定すると、ビューのフレーム長方形を変更しても、境界長方形が自動的に変更されることはなくなりました。詳細については、「ビューの再配置とサイズ変更」を参照してください。

于 2011-03-12T21:19:19.587 に答える