2011-03-01 75 views
3

我有一個自定義的NSView,它曾經在NIB中創建並作爲NSMenuItem的視圖分配,這非常棒,但現在我想在代碼中創建視圖我可以向你保證的好理由)哪個看起來不難,但是這個看法實際上並沒有繪製。可可 - NSMenuItem中的自定義NSView不會繪製

即使在發送「setNeedsDisplay:」消息時,以前被調用以在需要時繪製視圖的「drawRect:」消息不再被調用。

我用圖像初始化視圖,並設置大小(與圖像大小相匹配的視圖),因爲菜單項大小正確,但沒有圖像,所以似乎可行。

這裏可能會發生什麼?

這是給init視圖代碼:

-(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]; 
} 

回答

1

你必須設置你的視圖的frame你可以設置它的bounds之前。在你的-init...中,要麼調用兩個set...調用,要麼刪除setBounds:(默認情況下,bounds被設置爲{(0,0), (frame.size.width, frame.size.height)}),一切都應該工作。我也不認爲你需要在drawRect中再次設置framebounds,事實上,當焦點已經鎖定在視圖上時,改變這些似乎不是個好主意;如果這些值實際上不同,最好會造成奇怪的閃爍。

更新:剛纔看到這個便條在View Programming Guide

注意:一旦應用程序明確設置使用任何的setBounds ...方法視圖的邊界矩形,改變視圖的框架矩形不再自動更改邊界矩形。詳情請參閱「Repositioning and Resizing Views」。

+0

現貨!非常感謝:) – Nippysaurus 2011-03-13 09:54:36

+0

很高興我能幫忙。 – 2011-03-13 22:32:11

相關問題