CALayer의 display
과 drawInContext
과 관련된 내용은보기에 drawRect
과 관련이 있습니다.iOS에서 setNeedsDisplay는 실제로 drawRect를 호출하지 않습니다 ... CALayer의 표시 또는 drawInContext가 마지막으로 drawRect를 호출하지 않는 한?
NSTimer가 [self.view setNeedsDisplay]
을 1 초로 설정하면 drawRect
의 NSLog 문에 표시된 것처럼 drawRect
이 1 초마다 호출됩니다.
그러나 CALayer를 서브 클래스 화하여 뷰에 사용하면 display
메서드를 비워두면 지금은 drawRect
이 호출되지 않습니다. 업데이트 : 그러나 NSLog 문에 표시된 것처럼 display
은 1 초마다 호출됩니다.
빈 display
메서드를 제거하고 빈 drawInContext
메서드를 추가하면 drawRect
이 호출되지 않습니다. 업데이트 : 그러나 NSLog 문에 표시된 것처럼 drawInContext
은 1 초마다 호출됩니다.
정확히 무엇이 일어나고 있습니까? display
은 drawInContext
과 drawInContext
을 선택적으로 호출 할 수 있으며 어떻게 든 drawRect
(어떻게?)을 호출 할 수 있지만 실제로 상황은 무엇입니까?
업데이트 :
나는 다음에 CoolLayer.m
코드를 변경 : 대답 더 많은 단서가 달이있는 경우
-(void) display {
NSLog(@"In CoolLayer's display method");
[super display];
}
-(void) drawInContext:(CGContextRef)ctx {
NSLog(@"In CoolLayer's drawInContext method");
[super drawInContext:ctx];
}
을 따라서는, (의 말을하자 보기에서 위치 (100,100)에서 Core Graphics에 의해 그려진 원으로), 이제 위치 (200,200)로 변경하고, 당연히 [self.view setNeedsDisplay]
으로 전화 할 것이고, 이제 CALayer는 새로운 뷰 이미지 , 나의 ..로써 drawRect
은 달이 지금 어떻게 표시되어야 하는지를 지시합니다.
는 그럼에도 불구하고, 시작점의 CALayer의 display
다음의 CALayer의 drawInContext
이다 : 나는 drawRect
에서 브레이크 포인트를 설정하면 호출 스택을 보여줍니다
그래서 우리가 CoolLayer의 display
는 것을 알 수 있습니다 처음 입력하면 CALayer의 display
으로 이동 한 다음 CoolLayer의 drawInContext
으로 이동 한 다음 CALayer의 drawInContext
으로 이동합니다.이 경우 새 이미지에 대해 캐시가 존재하지 않습니다.
마지막으로 CALayer의 drawInContext
은 대표자의 drawLayer:InContext
을 호출합니다. 위임은 뷰 (FooView 또는 UIView) ...이고 drawLayer:InContext
은 UIView의 기본 구현입니다 (필자가 무시하지 않았으므로). 마지막으로 drawLayer:InContext
은 drawRect
입니다.
그래서 두 가지 점을 짐작할 수 있습니다. 이미지 캐시가 없어도 왜 CALayer를 입력합니까? 이 메커니즘을 통해 이미지가 컨텍스트에서 그려지고 마지막으로 display
으로 돌아가고이 컨텍스트에서 CGImage가 만들어지면 이제 캐시 된 새 이미지로 설정됩니다. 이것이 CALayer가 이미지를 캐싱하는 방법입니다.
또 다른 사실은 확실하지 않습니다. [self.view setNeedsDisplay]
항상 drawRect
을 호출하면 CALayer의 캐시 된 이미지를 사용할 수 있습니까? 맥 오에스 텐에서 다른 창문이 창문을 덮을 때, 그리고 맨 위 창문이 사라져 버렸다. 이제 모든 것을 다시 그리기 위해 drawRect
을 호출 할 필요는 없지만 CALayer에서 캐시 된 이미지를 사용할 수 있습니다. 또는 iOS에서 앱을 중지하고 다른 작업을 수행 한 다음 다시 앱으로 돌아 오면 drawRect
대신에 캐시 된 이미지를 사용할 수 있습니다. 그러나 이러한 두 가지 유형의 "더러운"을 구별하는 방법은 무엇입니까? 하나는 "알려지지 않은 더러운"입니다 - 달은 drawRect
논리에 의해 지시 된대로 다시 그려야합니다 (좌표에는 임의의 숫자도 사용할 수 있습니다). 더러운 다른 유형은 은폐되었거나 사라지게되었고, 이제 다시 표시해야합니다.
어떻게 CALayer가 작동합니까? –
문서에서'setNeedsDisplay'는 UIKit과 Core Graphics 도면들에 대해서만 작동한다고 명시 적으로 언급되었으므로, 더티 뷰 업데이트는 둘 다 유효합니다. 설명서에는 'CAEAGLLayer'가 유효하지 않으므로주의해야합니다. –
우리가'setNeedsDisplay'를 사용하지만 CALayer의 메서드를 오버라이드하면'drawRect'가 호출되지 않고 그 이유는 무엇입니까? –