2013-09-06 4 views
1

많은 nsview의 배경색을 변경하고 싶습니다. 내가 drawRect : NSview 하위 클래스에 재정의하지만 myview (참조 IBOUTLET) 배경색을 설정하는 방법을 모르겠습니다. 도와주세요. 너무 감사합니다코코아에서 NSview의 배경색을 변경하는 방법

코드에 대한 CustomView.h

#import <Cocoa/Cocoa.h> 

@interface CustomView : NSView 

@end 

코드 CustomView.m

#import "CustomView.h" 

@implementation CustomView 

- (void) drawRect:(NSRect)dirtyRect { 
    [[NSColor whiteColor] setFill]; 
    NSRectFill(dirtyRect); 
    [super drawRect:dirtyRect]; 
} 

@end 

를위한 메인 클래스, 난하지만 난에 대한 배경을 설정하는 방법을 모르는 #import "CustomView.h" 추가 myview.

답변

10

코코아 그림에 오신 것을 환영합니다. 코코아 드로잉은 PDF 모델 인 Quartz를 사용합니다. 이것의 묘화는 앞뒤의 절차 순서로 발생합니다.

Quartz 드로잉에는 그래픽 콘텍스트라고하는 드로잉 환경 상태 객체가있다. 이것은 AppKit의 많은 드로잉 작업에서 암묵적인 개체입니다. ...

당신은 등, 현재의 색과 다른 매개 변수는, 무언가를 그려, 다음 매개 변수를 변경하는 어떤 그래픽 컨텍스트에게 더 그릴 (코어 그래픽 또는 다른 API에 명시 적으로 호출 할 필요가 있었다) AppKit에서는 NSColor 객체에 메시지를 전송하여이를 수행합니다. 이는 이상합니다. 그러나 그것이 작동하는 방법입니다. 당신의 drawRect에서

: 당신이 색상을 변경하려면 방법 당신은 아마 그 위에 드로잉을 원하기 때문에 당신이 일반적으로 슈퍼 먼저 호출해야 ...

- (void) drawRect:(NSRect)dirtyRect { 
    [super drawRect:dirtyRect]; 

    // This next line sets the the current fill color parameter of the Graphics Context 
    [[NSColor whiteColor] setFill]; 
    // This next function fills a rect the same as dirtyRect with the current fill color of the Graphics Context. 
    NSRectFill(dirtyRect); 
    // You might want to use _bounds or self.bounds if you want to be sure to fill the entire bounds rect of the view. 
} 

, 당신은 필요합니다 @ 속성 NSColor 도면에 둘 이상이 필요할 수 있습니다.

이렇게하면 색을 설정할 수 있습니다.

KVO를 사용하고 자체 색상 속성을 관찰 한 다음 색상 속성이 변경되면보기를 원할 수 있습니다.

색상을 설정하는 데 많은 다른 작업을 수행 할 수 있습니다. (다른 곳의 버튼이나 팔레트) 그러나 결국 그 모두는 그림 그리기를위한 속성의 색을 설정하라는 메시지를 보냅니다.

마지막으로 드로잉을 업데이트하려면 [myView setNeedsDisplay:YES];을 호출해야합니다. 여기서 myView는 NSView 하위 클래스의 인스턴스에 대한 참조입니다. display도 있지만 그게 강력합니다. setNeedsDisplay:은 이벤트 루프 (runLoop)의 다음 실행시 스케줄을 지정합니다. display의 종류는 바로 모든 것을 바로 지금으로 만듭니다. 이벤트 루프가 충분히 빨리 돌아와서 강제로 실행하면 안됩니다. 참고 : setNeedsDisplay: 전체보기입니다. 복잡한보기가있는 환상적인 이상적인 세상에서 다시 그리기 위해 뷰의 특정 CG/NSRect를 지정하는 setNeedsDisplayInRect:을 호출하여 상황을보다 적절하게 최적화 할 수 있습니다. 이렇게하면 시스템에서 가능한 가장 작은 조합 rect로 다시 그리기에 집중할 수 있습니다.

+1

위대한 답변입니다. 왜? 문제를 해결하는 방법뿐 아니라 문제의 해결 방법 및 개념을 설명하기 때문입니다. 코코아를 처음 접했을 때이 정보는 높이 평가됩니다. – beipawel

+0

감사! 나는 그것이 매우 도움이 되었기 때문에 기쁘다. – uchuugaka

+0

나는 정말로 많이 다루지 않았다. 내가 그려야하는 견해를 말하게하는 방법에 대해 뭔가를 지적해야했습니다. – uchuugaka

관련 문제