질문을 얻었다. 내가 바닥을 스크롤 오전 내 배경으로 역할을하는 하위 클래스의 UIView가 있습니다. 이 코드는 Instrumentation에 따라 정말 멋지게 작동하고 있습니다. 나는 새어 나지 않고 살아있는 Object 할당이 성장하고 있지 않습니다.체인화 애니메이션과 메모리 관리
내 응용 프로그램에서 하위 클래 싱 된 UIView에서 소유 한 UIImageView에 애니메이션을 추가하면 보유 개수가 늘어나고 모든 애니메이션이 제거 될 때 다시 제거되는 것으로 나타났습니다.
내 질문은 키가있는 레이어에 애니메이션을 추가 할 때 공개 애니메이션 사전에 해당 애니메이션이 이미있는 경우 해당 애니메이션이 릴리스되어 자동 출시 풀로 이동한다고 가정합니다. ? 예를 들어
: 나는 실행을했다
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
NSString *keyValue = [theAnimation valueForKey:@"name"];
if ([keyValue isEqual:@"step1"] && flag) {
groundImageView2.layer.position = endPos;
CABasicAnimation *position = [CABasicAnimation animationWithKeyPath:@"position"];
position.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
position.toValue = [NSValue valueWithCGPoint:midEndPos];
position.duration = (kGroundSpeed/3.8);
position.fillMode = kCAFillModeForwards;
[position setDelegate:self];
[position setRemovedOnCompletion:NO];
[position setValue:@"step2-1" forKey:@"name"];
[groundImageView2.layer addAnimation:position forKey:@"positionAnimation"];
groundImageView1.layer.position = startPos;
position = [CABasicAnimation animationWithKeyPath:@"position"];
position.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
position.toValue = [NSValue valueWithCGPoint:midStartPos];
position.duration = (kGroundSpeed/3.8);
position.fillMode = kCAFillModeForwards;
[position setDelegate:self];
[position setRemovedOnCompletion:NO];
[position setValue:@"step2-2" forKey:@"name"];
[groundImageView1.layer addAnimation:position forKey:@"positionAnimation"];
}
else if ([keyValue isEqual:@"step2-2"] && flag) {
groundImageView1.layer.position = midStartPos;
CABasicAnimation *position = [CABasicAnimation animationWithKeyPath:@"position"];
position.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
position.toValue = [NSValue valueWithCGPoint:endPos];
position.duration = 12;
position.fillMode = kCAFillModeForwards;
[position setDelegate:self];
[position setRemovedOnCompletion:NO];
[position setValue:@"step1" forKey:@"name"];
[groundImageView1.layer addAnimation:position forKey:@"positionAnimation"];
}
}
무한이 체인 애니메이션,로 만든 객체 할당을 사는 것은 변경되지 않습니다. 그 핵심 위치에있는 애니메이션이 출시 될 때마다 나는 추측하고 있습니다.
그냥 내가 올바른 오전 궁금. 또한 Core Animation을 처음 접하게되었습니다. 나는 애니메이션을 재사용하면서 놀려고했지만 조금 참을성이 없었다. 애니메이션을 재사용 할 수 있습니까?감사합니다. 브라이언
는 유래에 다른 답변은 NO'와''kCAFillModeForwards'에 fillMode''이 설정을하지 않는 한, 애니메이션의 결과가 지속되지 않을 것이라는 점을 나타냅니다. 즉, 속성 변경은 'CALayer'에서 'CAAnimation'을 제거하면 제거됩니다. 애플은 분명히 속성 애니메이션을 비파괴적인 것으로 만들고 싶었다. 'animationDidStop : finished' 메소드를 사용하여 속성을 최종 상태로 설정할 수 있지만, CALayer가 사전 애니메이션 상태로 되돌아가는 그래픽 "blip"으로 끝나는 경우가 많습니다. 그것은 두려운 것처럼 보입니다. –
그게 대부분 맞지만 간단한 방법이 있습니다. 애니메이션은 레이어 자체에 적용되지 않습니다. 오히려'presentationLayer' 라 불리는 사본이 생성되고, 애니메이션이 그것에 적용됩니다. 또한, 메인 runloop의 모든 반복은 암시 적'CATransaction'으로 래핑되기 때문에 애니메이션을 추가하기 전에 레이어의 최종 속성을 설정할 수 있습니다. 애니메이션을 포함한 모든 변경 사항이 한 번에 제출되며 시작 또는 끝 부분에는 아무런 블립도 표시되지 않습니다. 예를 들면 다음과 같습니다.'myLayer.position = CGPointMake (100, 100); [myLayer addAnimation : anim forKey : @ "위치"]; –