2014-04-25 1 views
1

동시에 수정할 필요가있는 CALayer/CAShapeLayer/CATextLayer 개체가 있지만 하위 집합 만 애니메이션으로 만들어야합니다. 내가 애니메이션을 원하지 않는 레이어를 들어, 내가 CATransaction에서 업데이트를 포장하는 것은 다음과 같이 호출CATransaction 애니메이션 발생 setDisableActions : YES

- (void) setPlayerName:(NSString *)playerName 
{ 
    _playerName = playerName; 

    [CATransaction begin]; 
    [CATransaction setDisableActions:YES]; 

    [self updateNameLayer]; // Layer property updates happen in here 

    [CATransaction commit]; 

    // Update the screen 
    [self setNeedsLayout]; 
    [self setNeedsDisplay]; 
} 

내가 CATransaction[CATransaction setDisableActions:YES]; 외부 내가 애니메이션이 될 수 실현/커밋 통화를 시작 사용 때까지 아니었다 동시에 애니메이트되도록 설정된 개별 오브젝트에 영향을줍니다. 이 경우 해당 업데이트에 대한 모든 애니메이션이 비활성화되었습니다.

해결책은, 해당 트랜잭션에 대한 setDisableActions : 호출을 현지화하기 위해 CATransaction begin/commit 호출에서 각 업데이트를 명시 적으로 래핑하는 것이라고 생각했습니다. 이 작업을 수행 한 후에도 여전히 애니메이션이 전부 또는 아닌 것으로 보입니다. CATransaction의 작동 방식을 충분히 이해하지 못하는 것 같아서 나에게 들립니다.

여러 개의 동시 CALayer 암시 적 애니메이션 속성 업데이트를 처리하는 유일한 방법은 무엇입니까? 이러한 업데이트 호출 및 레이어는 여러 객체에 분산되어 있습니다.

+0

서로 얽혀있는 애니메이션 및 애니메이션이 아닌 변경 사항을 혼합하여 일치시키려는 경우,이 방법은 마치 겉보기에는 발견 한 것처럼 작동하지 않습니다. 특정 속성에 대한 애니메이션을 비활성화하는 방법은'[CALayer actionForKey :]'를보십시오. –

+0

이 경우 모든 CATransaction 블록을 제거하고 대신 속성 업데이트 전에'actionForKey :'를 사용 하시겠습니까? –

+1

actionForKey를 사용하면 지정된 레이어 속성의 모든 애니메이션을 비활성화 할 수 있습니다. 그것은 CALayer 서브 클래스에서 정의한 것이지 호출하는 것이 아닙니다. –

답변

2

확실히 당신이하려는 것은 수 있습니다 작품. 예 :

[CATransaction begin]; 
    [CATransaction setDisableActions:YES]; 
    self.lay1.position = CGPointMake(300,300); 
    [CATransaction commit]; 

    self.lay2.position = CGPointMake(300,300); 

두 레이어는 같은 위치로 이동하지만 그 중 하나는 애니메이션으로, 다른 레이어는 움직이지 않습니다.

코드가이 아니므로 더 이상 알 수 없으므로 설명 할 수 없습니다. 예를 들어 레이어에 모순 된 명령을 내릴 수 있으므로 애니메이션이 취소 될 수 있습니다. 그러나 당신은 확실히 합법적 인 트랙에 있습니다. 그러나 너무 어렵다면 암시 적 레이어 애니메이션을 포기하고 대신 CABasicAnimation 및 친구들을 사용하는 것이 좋습니다.

+0

좋습니다. 그래서 CATransactions는 시작/커밋 호출에서 래핑 할 때 실제로 분리됩니다 (CATransaction 클래스 참조에서 : "트랜잭션은 현재 스레드의 트랜잭션 내에 중첩됩니다."). 그래서, 제가 동시에 많은 것을하고 있다는 사실은 문제가 아닙니다. 그것은 어딘가에서 모순 될 가능성이 있습니다. 음 ... –

+0

그게 내가 생각하는거야. 내가 한 일은 단순한 경우에 이것이 효과가 있음을 증명하는 것이 었습니다. :) – matt

+0

K, 문제는 동시 애니메이션이 아니라 순차적 인 예입니다. 예를 들어 서로 다른 두 개체에서 동시에 발생하는 예를 상상해보십시오. 하나는 동작을 중지하고 다른 하나는 동작하지 않는 것입니다. 그게 바로 나를 위해 돈을 벌 수있는 곳입니다. 모순 된 명령을 찾아서 디버깅하는 방법을 찾기 위해 고심하고 있습니다. –

관련 문제