2011-03-01 6 views
3

NIB에서 생성되고 NSMenuItem의보기로 할당 된 사용자 지정 NSView가 있는데,이 코드는 위의 코드에서 뷰를 만들고 싶습니다. 내가 당신에게 확신시킬 수있는 좋은 이유).하지만 열심히 보이지는 않았지만, 실제로는 그림이 그려지지 않습니다.코코아 - 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]; 
} 

답변

1

당신은 설정해야합니다보기의 frame 당신이 bounds을 설정할 수 있습니다 전에. -init...에서 두 개의 set... 전화를 교환하거나 setBounds: (은 기본적으로 {(0,0), (frame.size.width, frame.size.height)}으로 설정 됨)을 제거하면 모든 것이 작동합니다. 또한 framebounds을 다시 drawRect에 설정해야한다고 생각하지 않습니다. 실제로 포커스가 이미 잠겨있는 경우에는 변경하는 것이 좋지 않은 것처럼 보입니다. 값이 실제로 다르면 기껏해야 이상한 깜박임이 발생할 것입니다. 응용 프로그램이 명시 적으로 뷰의 프레임 사각형을 변경의 setBounds ... 방법을 사용하여 뷰의 경계 사각형을 설정하면 :

업데이트 :

: 그냥 View Programming Guide에서이 메모를 보았다 더 이상 경계 사각형을 자동으로 변경하지 않습니다. 자세한 내용은 "Repositioning and Resizing Views"을 참조하십시오.

+0

스팟! 대단히 감사합니다 :) – Nippysaurus

+0

기꺼이 도와 드리겠습니다. –

관련 문제