2012-01-29 3 views
3

사용자 정의 NSView 하위 클래스의 그림자를 만들려고합니다.setShadow를 사용하여 NSView 그림자 적용 :

은 지금까지 내가 관리했습니다 : 만 파란색 사각형 (즉 그림자를) 렌더링

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     NSShadow *dropShadow = [[NSShadow alloc] init]; 
     [dropShadow setShadowColor: [NSColor redColor]]; 

     [self setWantsLayer: YES]; 
     [self setShadow: dropShadow]; 
    } 

    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [[NSColor blueColor] setFill]; 
    NSRectFill(dirtyRect); 

    [super drawRect: dirtyRect]; 
} 

합니다.

그림자를 올바른 위치에 설정하고 있습니까? setShadow: 사용에 필요한 모든 요구 사항을 충족합니까? 질문에 대답하기 전에

답변

19

몇 가지 참고 사항 :

  • 당신은 바닐라 NSViewdrawRect:super의 구현을 호출 할 필요가 없습니다. 디폴트의 ​​구현은 아무것도 실시하지 않습니다.
  • 이 아닌 채우기 사각형으로 [self bounds]을 사용해야합니다. dirtyRect 매개 변수는 도면을 필요로하는보기 부분을 나타내는 데 사용되며 도면 최적화에만 사용됩니다.
  • dropShadow 개체가 누출되고 있습니다. 생성 후 autorelease에 전화하거나 setShadow:을 호출 한 후 release으로 전화해야합니다.

그림자가 표시되지 않는 이유는 두 가지입니다. 먼저 레이어가 지원되는보기에서 그림자를 표시하려면보기의 수퍼 뷰가 레이어로 백업되어야합니다. 당신은 ARC와 pcperini의 방법의 파일을 컴파일하지 않는 경우

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     NSShadow *dropShadow = [[NSShadow alloc] init]; 
     [dropShadow setShadowColor:[NSColor redColor]]; 
     [dropShadow setShadowOffset:NSMakeSize(0, -10.0)]; 
     [dropShadow setShadowBlurRadius:10.0]; 

     [self setWantsLayer: YES]; 
     [self setShadow: dropShadow]; 

     [dropShadow release]; 
    } 

    return self; 
} 
+5

의 DropShadow의 "누출"A "누설"은 다음과 같습니다

둘째, 당신은 그림자의 색상을 설정하는하지만 그 다른 매개 변수 (자동 참조 횟수). 이 시점에서 ARC가 일반적으로 사용되고 ARC가 활성화되면 release 또는 autorelease를 호출하면 컴파일 오류가 발생합니다. – ctpenrose