1

내 클래스는 CALayer 서브 클래스이며, 나는 메시지를 잡는 경우,이 같은 기능을 실행 NSNotificationCenter를 통해 관찰자를 추가했습니다 :CALayer setNeedsDisplay가 작동하지 않습니까?

- (void)setCurrentAutoValue:(NSNotification *) obj 
{ 

    [self setNeedsDiaplay]; 
} 

하지만, 작동하지 않는이 사람이 도움을 줄 수 있습니까?

+0

정말로 'setNeedsDiaplay' 또는 아마도'setNeedsDisplay'를 의미합니까? – trojanfoe

+0

내 ** CALayer **는 ** NSNotificationCenter **가 메시지를 다시 그릴 때 즉시 모든 내용을 다시 그려야합니다. '[self setNeedsDiaplay];가 호출되었지만 변경 사항은 없습니다. – Magical

+0

** 잘못 입력 했습니까? – trojanfoe

답변

2

분명히 주 스레드에서 setNeedsDisplay를 호출해야합니다. performSelectorOnMainThread 메서드를 사용하여이 작업을 수행 할 수 있습니다. 귀하의 경우 예를 들어 :

[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:0 waitUntilDone:NO]; 
+0

고마워, 나는 이걸 스스로 풀었고 내 해결책은 너와 똑같다. – Magical

0

다른 스레드를 통해 내 CALayers를 업데이트하는 데 동일한 문제가있었습니다. 내가 같은 스레드에서 직접 다음 행 중 하나를 호출하면 그것은 완벽하게 작동 :

   [self setNeedsDisplay:YES]; 
       [self needsDisplay]; 
       [self.circleLayer needsDisplay]; 
       [self.circleLayer setNeedsDisplay]; 

을하지만 다른 스레드를 통해이를 호출 할 때, 변화가 없었다. 나는 약간 놀았고 사용을 끝냈다.

   [self display]; 

이것은 CALayers를 강제로 업데이트하는 유일한 것이다. Self는 여러 개의 레이어와 하위 레이어를 포함하는 NSOpenGLView입니다. 아마도 이것이 도움이 될 수 있습니다. 모든 CALayer는 동일한 방법을 사용할 수 있습니다. 어쩌면 당신은 디스플레이를 호출해야합니다.

+0

내 레이어가 포함 된 뷰가 없습니다. 사파리 NPAPI 플러그인에서 실행됩니다. – Magical

+0

아마도 CALayers의 일부인 [self display]를 사용할 수도 있습니다. 최근 프로젝트를 확인했습니다. 또한 CALayers의 업데이트로 이어질 것입니다. - (void) setCurrentAutoValue : (NSNotification *) obj { [자체 표시]; } 이 트릭을 수행 할 수 있습니다. – Bonzo

+0

사과 개발자 문서에서 [이 메소드를 직접 호출하면 안됩니다.] (https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CALayer_class/Introduction/Introduction.html) – Magical

0

내 문제는 내가 만 콘텐츠 (재산 "경로"에 CGPath)의 설정하지, 애니메이션으로의 CALayer를 업데이트 할 수 있었다. 자기에

[_myLayer removeAllAnimations]; 
UIBezierPath *newPath = ... 
_myLayer.path = newPath.CGPath; 
0

참고 : 또는 설정하지되었다의 CALayer의 프레임은 무엇 보이는 것은 유일한 해결책은 첫 번째 레이어의 모든 애니메이션을 제거하고 새 경로를 설정합니다. CALayer에 문제가있을 때마다 먼저 프레임! = NSZeroRect를 확인하십시오.