2014-08-29 4 views
0

CALayer에 사용자 지정 속성의 애니메이션을 구현하려고합니다. 속성을 동적으로 설정했으며 대부분 작동합니다. 내 앱에는이 레이어의 인스턴스가 12 개 이상있을 수 있으며이 레이어는 모두 동시에 애니메이션을 적용해야합니다. 그러나 애니메이션이 트리거 될 때 일부 레이어는 애니메이션을 수행하지 않습니다. 그들은 간단히 최종 값으로 바로 이동합니다.CABasicAnimation에서 신뢰할 수없는 실행

문제를 디버그 할 때 애니메이션이 시작될 때 문제가있는 레이어가 애니메이션 속성의 최종 값으로 모델 레이어에서 다시 그려지는 것처럼 보입니다. 나머지 레이어는 애니메이션 속성의 일시적인 값만 사용하여 프레젠테이션 레이어에서 다시 그리기 만합니다. 대개 문제가있는 계층의 마지막이지만 가끔은 임의의 계층입니다.

너무 산발적이어서 다음에 어디를 볼 지 잘 모르겠습니다. 당신은 부품의 대부분을 가지고있는 것처럼

@dynamic aspectModeFraction; 

- (id<CAAction>)actionForKey:(NSString *)key 
{ 
    if ([key isEqualToString:@"aspectModeFraction"]) 
    { 
     CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:key]; 
     animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; 
     animation.fromValue = @([[self presentationLayer] aspectModeFraction]); 
     animation.duration = 2.0f; 
     animation.delegate = self; 
     return animation; 
    } 
    return [super actionForKey:key]; 
} 

+ (BOOL)needsDisplayForKey:(NSString *)key { 

    if ([@"fullRect"   isEqualToString:key]) { return YES; } 
    if ([@"localRect"   isEqualToString:key]) { return YES; } 
    if ([@"screens"   isEqualToString:key]) { return YES; } 
    if ([@"aspectModeFraction" isEqualToString:key]) { return YES; } 

    return [super needsDisplayForKey:key]; 
} 
+0

어떻게 애니메이션을 요청합니까? 내 경험상, 키 - 값 코딩을 사용하면 항상 효과적입니다. 예를 들어 'myLayer.aspectModeFraction = whatever','[myLayer setValue : whatever forKey : @ "aspectModeFraction"]'라고 해보고 그 차이가 있는지 확인해보십시오. – matt

답변

0

제안 해 주셔서 감사합니다. 나는 결국 문제를 추적했다. 이 매개 변수가 변경되면 일부 계산 만 수행하도록 드로잉 코드를 최적화했습니다. 매개 변수가 업데이트되어 다음 끌기 루프 중에 다시 계산되도록 계산을 더러워서 표시했습니다. 더티 플래그는 매개 변수에 대한 사용자 정의 설정기를 통해 설정되었습니다. @dynamic (CAAnimations에 필요한 것 같습니다)으로 전환하면 사용자 정의 설정자가 없어져서 객체가 KVO 자체를 수행하여 더티 플래그를 업데이트하고있었습니다. observeValueForKeyPath : ...가 애니메이션 중에 호출되지 않고있는 것으로 나타났습니다. 그것은 최종 값에 대한 하나의 업데이트를 가지지 만 중간체는 없습니다.

어쨌든 최적화를 취소하고 매번 계산할 때마다 문제가 해결되었습니다. 예상대로 작동하지 않는 애니메이션 가치에 KVO는 범인 인 것처럼 보였다.

0

것 같습니다 :

여기에 애니메이션을 트리거 코드의 조각입니다. 커스텀 자산 애니메이션에는 작은 부분들이 많이 있는데, this talk은 여전히 ​​도움이 될 수 있습니다. 아마도 주요한 것들이있는 것처럼 보일 것입니다.

나는 먼저 호출 코드를 의심합니다. 예를 들어 애니메이션을 억제하지 않거나 주 스레드에서 UIKit 조각을 수정하지 않았는지 확인해야합니다.

복사 한 레이어 속성을 얻으려면 @dynamic을 사용하는 트릭이 공식적으로 지원되지 않을 수 있습니다. (내가 아는 모든 문서에서 나오는 것보다 "작동하는 것"중 하나이며, 일부 Apple 엔지니어와 통화했을 때, 그렇게하는 것을 들어 본 적이 없었습니다.) 만약 당신이 ' 10.9 이상에서만 문제가 발생하는 경우 에 복사하는 표준 속성으로 @dynamic의 사용을 대체 할 수 있습니다.

+0

사용자 정의 속성에 애니메이션을 적용하는 것은 공식입니다. Apple [sample code] (https://developer.apple.com/library/ios/samplecode/sc2284/Introduction/Intro.html#//apple_ref/doc/uid/DTS40014302)에서 구체적으로 어떻게하는지 보여줍니다. 사실, 전체 애니메이션 시스템은 이러한 방식으로 확장 가능하도록 특별히 설계되었습니다. – matt

+0

사용자 지정 속성을 애니메이션 할 수 있다는 것을 알고 있습니다. 사실은 제가 말했듯이 @ 문서화되어 있지 않으며 acutally 지원되지 않을 수도있는 @ 동적 속성 자동 복사입니다. 링크 된 코드를 보면, @ initWithLayer :'에 복사본을 구현하고 @dynamic을 사용합니다. (CustomAnimatableProperty/BulbLayer.m을 보라.) 이것을 처리 할 수있는'initWithLayer :'메서드가 있음을 나타내지는 않는다. –

관련 문제