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으로 생성 된 애니메이션을 포함하여 모든 애니메이션이 취소되는 것처럼 보입니다.
나는 내가 무엇을 놓치고 있습니까?
미리 감사드립니다.
감사합니다. 나는 일을 끝내는 길을 보여 줬어! 문제는 '플러시'방법이었습니다. 나는 그것을 제거하고 이제 모든 애니메이션이 정상적으로 돌아가는 것을 볼 수 있습니다. 'obj1', 'obj2'및 'obj3'은 공통적으로 'masterLayer'의 하위 레이어라는 점만 제외하면 교차 포인터 나 애니메이션이 서로 간섭하지 않습니다. 'flush'메서드를 호출하면 이전 애니메이션이 중단되었습니다. 대리자 메서드 'animationDidStop : finished :'완료 인수가 NO를 반환하여 수동으로 중지되었음을 나타냅니다 ('flush'메서드가 호출되었을 때 발생했습니다). –
비록 효과가 있었지만 플러시 메서드에 대한 설명서의 내용을 이해하려고 노력했습니다 (http://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CATransaction_class/Introduction/Introduction.html#//apple_ref/ occ/clm/CATransaction/flush) 내 명확한 애니메이션이 왜 멈추게되었는지는 아직 명확하지 않습니다. –
@Eduardo - 그렇습니다. 정상적인 Core Animation 렌더링 파이프 라인을 방해하기 때문에 애니메이션을 방해하는 '[CATransaction flush]'문제도있었습니다. 오직 한 번만 내가 그것을 위해 필요로했고, 심지어 나는 그 전화를 제거하기 위해 내가하고 있었던 것을 재 설계 할 길을 찾았습니다. –