2010-12-10 1 views
0

CATransaction 블록의 범위를 수행하여 superlayer이다 다음그것으로부터 소정의 층을 제거 I는 일부 코드를 보이면서

void RemoveImmediately(CALayer *layer) { 
    [CATransaction flush]; 
    [CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue 
        forKey:kCATransactionDisableActions]; 
    [layer removeFromSuperlayer]; 
    [CATransaction commit]; 
} 

I는 애니메이션에서 소정 층의 위치를 ​​변경하는 방법을 기록한 CAKeyframeAnimation을 사용하면 다음과 같은 모양이됩니다.

- (void)animateMovingObject:(NXUIObject*)obj 
      fromPosition:(CGPoint)startPosition 
      toPosition:(CGPoint)endPosition 
       duration:(NSTimeInterval)duration {  

    CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; 
    pathAnimation.calculationMode = kCAAnimationPaced; 
    pathAnimation.duration = duration; 

    CGMutablePathRef curvedPath = CGPathCreateMutable(); 
    CGPathMoveToPoint(curvedPath, NULL, startPosition.x, startPosition.y); 
    CGPathAddCurveToPoint(curvedPath, NULL, 
         startPosition.x, endPosition.y, 
         startPosition.x, endPosition.y, 
         endPosition.x, endPosition.y); 
    pathAnimation.path = curvedPath; 
    [obj addAnimation:pathAnimation forKey:@"pathAnimation"]; 
    CGPathRelease(curvedPath); 
} 

잘 알고 있듯이 모든 것이 좋습니다. 이제 내 응용 프로그램에 3 개의 하위 레이어가있는 '마스터 레이어'가 있다고 가정 해 보겠습니다. 처음 두 개의 하위 레이어를 다른 위치로 옮기고 마지막 두 개의 하위 레이어를 제거하려고합니다. 심지어 인수로 obj3을 전달 RemoveImmediately()를 호출하는 경우 내가 처음 두 개의 층이 애니메이션을 볼 수 없습니다

CALayer obj1 = ... // set up layer and add as sublayer 
[self.masterLayer addSublayer:obj1]; 
[self animateMovingObject:obj1 
      fromPosition:CGPointMake(0.0, 0.0) 
       toPosition:CGPointMake(100.0, 100.0) 
       duration:2.0]; 

CALayer obj2 = ... // set up layer and add as sublayer 
[self.masterLayer addSublayer:obj2]; 
[self animateMovingObject:obj2 
      fromPosition:CGPointMake(0.0, 0.0) 
       toPosition:CGPointMake(150.0, 100.0) 
       duration:2.0]; 

CALayer obj3 = ... // set up layer and add as sublayer 
[self.masterLayer addSublayer:obj3]; 
// ... 
RemoveImmediately(obj3);  // This removes the two previous animations too 
//[obj3 removeFromSuperlayer]; // This just removes obj3, the previous animations works 

참고 : 그래서 나는 다음과 같은했다. 그러나 removeFromSuperlayer을 호출하여 obj3을 제거하면 처음 두 레이어가 정상적으로 애니메이션됩니다. CATransaction 블록은 CAKeyframeAnimation으로 생성 된 애니메이션을 포함하여 모든 애니메이션이 취소되는 것처럼 보입니다.

나는 내가 무엇을 놓치고 있습니까?

미리 감사드립니다.

답변

2

CATransaction의 범위는 [CATransaction begin][CATransaction commit] 사이 여야합니다.

또한 해당 코드에는 [CATransaction flush]이 필요 없습니다. Apple은 일반적으로 성능상의 이유로 보류중인 트랜잭션의 실행을 강제하지 않을 것을 권장하며, 거기에 설정중인 트랜잭션은 보류중인 애니메이션에는 영향을 미치지 않아야합니다.

나는이 이상한 행동이 여전히 당신의 previous question에서 물어 본 것과 관련이 있다고 생각하는데, 여기서 세 애니메이션은 어떻게 든 서로를 방해합니다. 내가 여기서 언급했듯이, 3 개의 애니메이션이 하나의 레이어에 추가되고 3 개의 독립적 인 애니메이션에는 추가되지 않는 것처럼 동작합니다. 나는 그 일이 일어날 가능성을 확인했다. (교차 포인터 등).

+0

감사합니다. 나는 일을 끝내는 길을 보여 줬어! 문제는 '플러시'방법이었습니다. 나는 그것을 제거하고 이제 모든 애니메이션이 정상적으로 돌아가는 것을 볼 수 있습니다. 'obj1', 'obj2'및 'obj3'은 공통적으로 'masterLayer'의 하위 레이어라는 점만 제외하면 교차 포인터 나 애니메이션이 서로 간섭하지 않습니다. 'flush'메서드를 호출하면 이전 애니메이션이 중단되었습니다. 대리자 메서드 'animationDidStop : finished :'완료 인수가 NO를 반환하여 수동으로 중지되었음을 나타냅니다 ('flush'메서드가 호출되었을 때 발생했습니다). –

+0

비록 효과가 있었지만 플러시 메서드에 대한 설명서의 내용을 이해하려고 노력했습니다 (http://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CATransaction_class/Introduction/Introduction.html#//apple_ref/ occ/clm/CATransaction/flush) 내 명확한 애니메이션이 왜 멈추게되었는지는 아직 명확하지 않습니다. –

+0

@Eduardo - 그렇습니다. 정상적인 Core Animation 렌더링 파이프 라인을 방해하기 때문에 애니메이션을 방해하는 '[CATransaction flush]'문제도있었습니다. 오직 한 번만 내가 그것을 위해 필요로했고, 심지어 나는 그 전화를 제거하기 위해 내가하고 있었던 것을 재 설계 할 길을 찾았습니다. –

관련 문제