2011-04-09 4 views
1

CALayer에서 제공하는 암시 적 애니메이션을 활용하고 싶지만 제대로 작동하지 않는 것 같습니다. 내보기 컨트롤러에서 인스턴스 변수 CALayer * testLayer 선언합니다. 이 코드로 testLayer를 인스턴스화합니다.removeFromSuperlayer를 호출 할 때 암시 적 애니메이션이 없음

- (void)viewDidLoad { 
    testLayer = [[CALayer alloc] init]; 
    testLayer.bounds = CGRectMake(0, 0, 100, 100); 
    testLayer.position = CGPointMake(400, 400); 
    [testLayer setBackgroundColor:[UIColor redColor].CGColor]; 
    testLayer.delegate = self; 
    [self.view.layer addSublayer:testLayer]; 
    [testLayer release]; 
} 

그런 다음 touchesBegan에서 상위 레이어에서 레이어를 제거합니다.

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
[testLayer removeFromSuperlayer]; 
} 

레이어가 애니메이션없이 즉시 사라집니다. 이 CALayer에 암시 적 애니메이션을 사용하려면 어떻게해야합니까?

답변

1

먼저 testLayer가 -viewDidLoad에서 출시되었습니다. -touchesBegan에서 다시 액세스하면 올바르지 않습니다. 그것이 참조한 레이어는 여전히 존재하지만 서브 레이어 배열에 의해서만 유지됩니다. 이 같은 오토 릴리즈의 CALayer을 만들기 위해 코드를 변경할 수 :

- (void)viewDidLoad { 
    testLayer = [CALayer layer]; 
    testLayer.bounds = CGRectMake(0, 0, 100, 100); 
    testLayer.position = CGPointMake(400, 400); 
    [testLayer setBackgroundColor:[UIColor redColor].CGColor]; 
    testLayer.delegate = self; 
    [self.view.layer addSublayer:testLayer]; 
} 

는 이제 실제로 -touchesBegan에서 레이어 계층 구조에서 제거 얻을 것이다. 그것이 더 이상 참조를 보유하고 있지 않기 때문에 -touchesBegan에서도 풀릴 것이라는 사실을 명심하십시오. 다시 초기화해야하거나 -removeFromSuperlayer를 호출하기 전에 직접 유지해야합니다.

+0

답장을 보내 주셔서 감사합니다. 필자가 보여 주었던 코드 구현을 시도했지만 여전히 동일한 결과를 얻고 있습니다. 이 프로젝트는이 레이어와 관련된 코드 만 사용하여 뷰 기반 응용 프로그램 템플릿을 사용하여 새 프로젝트에서 시도했습니다. –

+0

그러나 레이어의 위치 또는 불투명도를 변경하면 해당 변경 사항이 애니메이션으로 표시됩니다. removeFromSuperLayer 만 효과가 없습니다. –

+0

나는이 경우에 불투명도를 움직여야한다고 생각한다. 슈퍼 뷰에서 뷰의 제거를 애니메이션으로 만들 수 있지만 슈퍼 레이어에서 레이어 제거를 애니메이션으로 만들 수는 없다는 것을 알고 있습니다. 애니메이션이 완료되는지 (-animationDidStop : finished :) 볼 수 있으며, 실제로 그 시점에서 부모로부터 레이어를 제거 할 수 있습니다. 아니면 약간의 속임수를 썼을 수 있습니다. -performSelector : withObject : afterDelay : 애니메이션 시간보다 조금 더 지연 값을 전달합니다. –