2010-06-22 5 views
1

개별적인 CALayer가있는 개별 사진을 많이 만들었으며 서로 다른 속도로 비동기 적으로 페이드 인 및 페이드 아웃해야합니다. 각각에는 배경 하위 계층과 채우기 하위 계층이 있습니다. 백그라운드에서 타이머가 실행되어 각 순간을 개별적으로 애니메이션으로 표시합니다. 프로그램의 현재 동작에 대해 각 개별 객체에 애니메이션을 적용하지 않고 대신 전체 화면을 애니메이션으로 표시합니다. 한 번에 하나의 이미지 만 애니메이션으로 만들 수 있도록 도와 주시겠습니까?CABasicAnimation은 하나의 애니메이션에만 애니메이션을 적용 할 때 모든 것을 애니메이션으로 만듭니다.

편집 : 내가 분명해야합니다. 타이밍은 문제가 아닙니다. CoreAnimation으로 전환하기 전에 이러한 이미지가 적절한 시간에 올바르게 애니메이션되었습니다. 하지만 여기서 가장 중요한 문제는 하나의 이미지에 애니메이션을 적용하면 모든 이미지 외부의 화면 배경 부분을 포함한 전체 화면이 애니메이션으로 표시된다는 것입니다.

다음 코드 세그먼트는 UIView 코드에서 계층 구조를 만들기위한 것입니다. 자체는 기본 UIView를 나타냅니다. 반환 값은 화면에 이러한 작은 이미지 중 하나를 나타내는 클래스에 대한 CALayer 멤버 변수를 설정하는 데 사용됩니다.

- (CALayer *) createImageLayer:(CGPoint)orig Center:(CGPoint)pos { 
    CALayer *parentLayer = [self layer]; 
    CALayer *childLayer1 = [CALayer layer]; 
    childLayer1.bounds = CGRectMake(0, 0, 40.0f, 40.0f); 
    childLayer1.position = pos; 
    CALayer *childLayer2 = [CALayer layer]; 
    childLayer2.bounds = CGRectMake(0, 0, 40.0f, 40.0f); 
    childLayer2.position = pos; 

    float components[4] = {1.0, 1.0, 1.0, 1.0}; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGColorRef whiteColor = CGColorCreate(colorSpace, components); 

    childLayer1.backgroundColor = whiteColor; 
    childLayer2.backgroundColor = whiteColor; 

    UIImage *childImage = [UIImage imageNamed:@"back.png"]; 
    UIImage *childImage2 = [UIImage imageNamed:@"fill.png"]; 

    CGImageRef imageRef = [childImage CGImage]; 
    CGImageRef imageRef2 = [childImage2 CGImage]; 

    childLayer1.contents=(id)imageRef; 
    childLayer2.contents=(id)imageRef2; 

    [parentLayer addSublayer:childLayer1]; 
    [parentLayer addSublayer:childLayer2]; 

    CGColorSpaceRelease(colorSpace); 
    CGColorRelease(whiteColor); 

    return parentLayer; 
} 

애니메이션을 적용하도록 지정하는 코드. 이미지 객체는 해당 레이어 멤버에 애니메이션을 추가하라는 지시를받습니다.

- (void) fadeAnimation:(ImageClass *)image { 
    CABasicAnimation *theAnimation; 

    theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"]; 
    theAnimation.duration=1.0; // fixed duration for now 
    theAnimation.repeatCount=1; 
    theAnimation.autoreverses=YES; 
    theAnimation.fromValue=[NSNumber numberWithFloat:1.0]; 
    theAnimation.toValue=[NSNumber numberWithFloat:0.0]; 
    [image.myLayer addAnimation:theAnimation forKey:@"animateOpacity"]; 
} 

답변

0

먼저 코드를 쉽게 읽을 수 있도록 것이다 꽤 크게 응축 될 수있다 :

- (CALayer *) createImageLayer:(CGPoint)orig Center:(CGPoint)pos 
{  
    CALayer *childLayer1 = [CALayer layer]; 
    childLayer1.bounds = CGRectMake(0, 0, 40.0f, 40.0f); 
    childLayer1.position = pos; 

    CALayer *childLayer2 = [CALayer layer]; 
    childLayer2.bounds = CGRectMake(0, 0, 40.0f, 40.0f); 
    childLayer2.position = pos; 

    childLayer1.backgroundColor = [[UIColor whiteColor] CGColor]; 
    childLayer2.backgroundColor = [[UIColor whiteColor] CGColor]; 

    childLayer1.contents=(id)[[UIImage imageNamed:@"back.png"] CGImage]; 
    childLayer2.contents=(id)[[UIImage imageNamed:@"fill.png"] CGImage]; 

    [[self layer] addSublayer:childLayer1]; 
    [[self layer] addSublayer:childLayer2]; 

    return parentLayer; 
} 

다음으로,이 타이머를 만드는 것보다 그 대신 제안, 당신은 단지 -performSelector을 사용합니다 : withObject : afterDelay. 그런 다음 afterDelay 매개 변수를 비틀 거리며 한 번에 모든 애니메이션을 추가 할 수 있습니다. 다음과 같은 내용이 있습니다 :

int i = 0; 
for (i = 0; i < 10; ++i) 
{ 
    [self performSelector:@selector(fadeAnimation:) 
       withObject:images[i] 
       afterDelay:(CGFloat)i]; 
} 

images는 ImageClass 개체의 C 배열입니다. 물론 C 배열을 사용할 필요는 없습니다. NSArray를 사용할 수도 있지만 afterDelay 매개 변수에 대한 카운터가 필요합니다. 이렇게하면 1 초마다 애니메이션이 비틀어집니다. 나는 당신이 원하는 것을 정확하게 모르겠다. 그래서 이것을 단지 예로서 보여주고있다.

Core Animation에서 요구하는 다른 방법이 있습니다. 당신은 애니메이션 그룹핑과 beginTime 속성을 볼 수 있지만, 위에서 언급 한 -peformSelector 메서드는 저항이 적은 경로라고 생각합니다.

감사합니다.

+0

감사합니다. 내가 얻었던 주된 문제는 [self fadeAnimation : myImage]와 같은 각 개별 이미지에 페이드 애니메이션을 수행한다고 말하면 대신 애니메이션이 전체 화면에는 있지만 이미지에는 적용되지 않는다는 것입니다. 타이밍은 실제로 나에게는 문제가 아니지만 타이머보다 내 용도에 더 적합하다고 생각하므로 제안을 시도해 볼 수 있습니다. – William