2012-01-11 2 views
0

According to documentation 기본 구현은 아무 것도 수행하지 않습니다. [의 CALayer drawInContext :] 대리자 메서드를 호출 -않습니다 - [CALayer drawInContext :] 뭔가합니까?

3 EasyWakeup       0x0003a7b6 -[AlarmIntervalView drawRect:] + 71 
4 UIKit        0x003f6187 -[UIView(CALayerDelegate) drawLayer:inContext:] + 426 
5 QuartzCore       0x011a8b5e -[CALayer drawInContext:] + 143 

그래서 내가 이해할 수있는대로 디폴트의 구현을 의미

는하지만 ...의 drawRect 메서드에서 예외를 발생하고 난 다음 호출 스택을 참조하십시오. 맞습니까? 나는 swizzling 기술을 가지고 있기 때문에 객관적으로 무엇이든 확실하지 않습니다. ...

+0

일부 코드가 필요합니다. 코드가 어떻게 설정되어 있습니까? 보기에 맞춤 레이어가 있습니까? 여러 레이어에 대한 위임자로보기를 설정하고 있습니까? – pe8ter

+0

@ pe8ter 빈 프로젝트를 만들고 문제를 재현하기 위해 마이너 코드를 삽입합니다. 당신은 그것을 여기에서 볼 수 있습니다 : [link] (http://pastebin.com/cEVNjgwR) – Speakus

+0

당신은 명시 적으로 예외를 던지고 있습니다. 왜? – pe8ter

답변

4

CALayer의 기본값 인 drawInContext:은 아무런 효과가 없습니다. 레이어의 대표자가 drawLayer:inContext: 대리자가없는 경우에는 마찬가지입니다. 따라서 문서의 문제는 "기본 구현은 아무 것도하지 않습니다."라는 문구 옆에 작은 별표가 있어야한다는 것입니다.

모든보기는 일종의 CALayer로 지원됩니다. 이 레이어는 자동으로 뷰가 해당 델리게이트로 설정되도록 설정됩니다. 표면에 분명하지 않은 것은 UIView가 CALayer의 대표자 인 drawLayer:inContext:을 구현한다는 것입니다. 이것은 호출 스택에있는 모든 호출로보고있는 것입니다.

인스턴스의 AlarmIntervalView에는 자동으로 백업 레이어가 있고 그 백업 레이어의 대리인은 AlarmIntervalView 인스턴스로 설정되어 있습니다. 시스템의 일부에서는 대리자가 있는지 확인하는 drawInContext:을 호출하고 대리자 respondsToSelector:drawLayer:inContext:과 함께 (UIView가 응답하는) 인수로 보내고 실제로는 drawLayer:inContext:이라는 메시지를 보냅니다. drawLayer:inContext:의 UIView 구현은보기의 drawRect:을 호출합니다.

나는 왜 당신이 윙윙 거리며 언급하는지 정말로 모르겠다.

[내 답변은 길기 때문에 대부분 내 이익입니다. 그것은 내가 배우는 데 도움이됩니다.]