2012-01-14 4 views
1

UIView에서 [self setNeedsDisplay]을 호출해도 [self.layer setNeedsDisplay]이 발생하지 않는 것 같습니다.CALayer의 setNeedsDisplay를 호출하는 UIView setNeedsDisplay?

- (void)setNeedsDisplay { 
    [super setNeedsDisplay]; 
    [self.layer setNeedsDisplay]; 
} 

이 문제에 저를 얻을 것이다 다음과 같이 내가 setNeedsDisplay를 오버라이드 (override)하는 경우는 확실히인가? 아마도 더 좋은 방법이 있을까요? 감사합니다.

+0

왜 필요하다고 생각하십니까? –

+0

'[myView.layer setNeedsDisplay]'도 호출하지 않고'[myView setNeedsDisplay]'메서드를 호출하고 싶습니다. 내 UIView 하위 클래스 내에 정교한 CALayer 계층 구조를 설정했습니다. – Ana

+0

왜 [CALayer setNeedsDisplay]를 호출해야합니까? '[UIView setNeedsDisplay]'를 호출하면 실행 루프가 끝날 때'-drawRect :'가 트리거됩니다. 너 또 무슨 짓을하려는거야? –

답변

1

나는 그것이 당신을 곤경에 빠뜨리는 이유를 모르겠다. setNeedsDisplay/setNeedsLayout보기/레이어를 표시/레이아웃해야한다고 플래그를 지정합니다. 다음에 실행 루프 주위에서 드로잉을 할 것입니다.

나는보기에 그것을 호출해도 레이어에서 발생하지는 않지만, 결국 UIView 및 관련 CALayer이 매우 긴밀하게 통합 되었기 때문에 매우 놀랍습니다.

전반적으로 볼 때 setNeedsDisplay을 호출하여 문제가 해결되지 않으면 해결책을 찾으십시오. 나는 그것이 어떻게 해를 끼칠 수 있는지 보지 못했다.

+1

UIView는 drawRect :가 구현 될 때 기본 CALayer에서만 setNeedsDisplay를 호출합니다 (메서드가 비어 있어도 아무 것도하지 않더라도). 이것은 UIView의 setNeedsDisplay에 레이어도 일부 그리기가 있음을 알려줍니다. 레이어의 setNeedsDisplay가 자동으로 호출되도록하는 또 다른 방법은 레이어의 플래그 needsDisplayOnBoundsChange를 true로 설정하여 뷰의 경계가 변경 될 때마다 (즉 레이어의 경계를 자동으로 변경하는) setNeedsDisplay를 트리거하는 것입니다. 그러나 귀하의 질문에 대답하기 위해 drawRect :를 재정의하지 않으면 현재하고있는 일이 잘됩니다. 그렇지 않으면 중복됩니다. –

+0

Thanks @ Mr.T, 당신의 의견이 내 질문에 대답했습니다. 별도의 답변으로 게시해야합니다. – titaniumdecoy

+0

고마워요 @titaniumdecoy. 내가 도울 수있어서 기뻐! –

3

나는 이것을 다른 답변에 대한 의견으로 올렸지 만, 다른 사람들에게 도움이 될 수 있습니다.

drawRect:이 구현 될 때 UIView는 기본 CALayer에 대해서만 setNeedsDisplay을 호출합니다 (메서드가 비어 있어도 아무 것도하지 않더라도). 이것은 UIView의 setNeedsDisplay에 레이어도 일부 그리기가 있음을 알려줍니다.

레이어의 setNeedsDisplay가 자동으로 호출 할 수있는 또 다른 방법은 setNeedsDisplay를 트리거 할 true로 레이어의 플래그 needsDisplayOnBoundsChange을 설정하는 것입니다 때마다 (자동으로 레이어의 경계를 변경) 뷰의 경계 변경. 그러나 귀하의 질문에 대답하기 위해, drawRect:을 덮어 쓰지 않으면 잘하고 있습니다. 그렇지 않으면 중복됩니다.

관련 문제