2010-07-18 4 views
2

레이어 호스팅보기에 문제가 있습니다. 그래서 나는이를 제거 할레이어 호스팅보기가 표시되지 않습니다.

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     [self setWantsLayer:YES]; 
     [[self layer] setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];  
     [[self layer] setContents:[NSImage imageNamed:NSImageNameBonjour]]; 
    } 
    return self; 
} 

내가 프로그래밍보기를 구성 할 수 있도록하려면 : (뷰가 검은 가득) 제공하는 예상대로 initWithFrame: 작품이 버전은 인터페이스 빌더에서 선택한 '코어 애니메이션 레이어 싶어' Interface Builder에 의존합니다. 아래는 이것을 달성하기위한 두 번째 버전입니다. 이것은 작동하지 않습니다.

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     CALayer *rootLayer = [CALayer layer]; //Added this line, 
     [self setLayer:rootLayer]; //and this line only 
     [self setWantsLayer:YES]; 
     [[self layer] setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];  
     [[self layer] setContents:[NSImage imageNamed:NSImageNameBonjour]]; 
    } 
    return self; 
} 

내가 문서에서 코드를 복사하여 내가 찾은 웹 및 모든 예제는 정확히 이런 짓을 검색하지만, 제대로 동작하지 않습니다 : 뷰는 상위 뷰와 동일한 색상을 유지!

내가 뭘 잘못하고 있니?

답변

1

문제는 레이어와 관련이 없지만 뷰 라이프 사이클에서 레이어가 초기화되는 경우입니다.

코드에서보기를 만들고 이미 화면에 그려진 창에 추가하는 경우 initWithFrame: 메서드를 사용하여 레이어를 만들 수 있습니다. 그러나보기가 NIB에서 초기화되면이 기능은 작동하지 않습니다. NIB에서 초기화 될 때 initWithFrame: 메서드가 호출되어 부모 윈도우가 완전히 초기화되어 레이어가 표시되지 않습니다. 창을 NIB awakeFromNib에 저장하는 경우 initWithFrame: 대신 사용할 수 있으므로 레이어가 올바르게 초기화됩니다.

물론 레이어를 생성 할 수있는 코드에서 두 지점을 갖는 것은 추악합니다. 위의 두 경우 모두 유용한 점에서 viewDidMoveToSuperview이 호출됩니다. 레이어가 한 번만 생성되도록하려면 확인을 viewDidMoveToSuperview에 추가해야합니다.

(정신 노트 -. 당신이 잠을 필요로 좋은 징조 오버플로 뭔가 이해가되지 않습니다 그리고 당신은 스택에 요청해야 느끼는 경우)

0

당신이 initWithFrame에서 다음을 호출하려고 할 수 있습니까?

[layer setFrame:[self bounds]]; 
관련 문제