2012-04-14 6 views
5

Xcode 4.3.2에서 iPhone 5.1 용 Obj.-c 사용; 나는 같은 이미지에서 모든 CALayers 배열을 만듭니다. 그런 다음 CATransactions를 통해 그룹화하여 배열의 각 CALayer에 CABasicAnimation을 동시에 적용하려고합니다. 이 모든 것은 한 번 작동합니다. 그러나 CATransactions에 포함 된 CABasicAnimations 블록을 반복적으로 호출하고 싶지만 블록이 동시에 실행될 때마다 개별적으로 각 애니메이션의 속성을 수정할 수 있어야합니다. 예를 들어, 각 레이어의 애니메이션에 대해 매번 무작위로 변경하려는 애니메이션의 값을 from에서 to까지 가질 수 있습니다. 왜냐하면 동일한 기본 애니메이션을 반복하고 싶지만 속성을 수정해야하기 때문입니다. 애니메이션의 repeatCount 속성을 높은 값으로 설정하면 작동하지 않습니다. 애니메이션 메서드를 반복적으로 호출하는 시도는 makeSwarm 메서드 내 for 루프를 사용하여 animationDidStop을 사용하여 애니메이션 메서드의 다른 호출을 유도하지만 일어나는 일은 새로운 호출입니다. 끝 부분이 아니라 CATransaction 블록으로 만들어지며 메서드 호출 자체도 갖습니다 (애니메이션 메서드 끝 부분에 [self animate] 입력). 이 작품은 없습니다. 다음은 기본 코드입니다. 나는 이것이 간단하다고 생각하지만, 중요한 것을보고 있지 않습니다. 감사합니다, 세스CATransaction 블록에 포함 된 여러 CABasicAnimations를 루프하는 방법은 무엇입니까?

ViewController.h

#import <QuartzCore/QuartzCore.h> 
#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController{ 
    UIImage *beeImage; 

    UIImageView *beeView; 
    CALayer *beeLayer; 
    CABasicAnimation *animat; 
    NSMutableArray *beeArray; 
    NSMutableArray *beeanimArray; 

} 

@property(retain,nonatomic) UIImage *beeImage; 
@property(retain,nonatomic) NSMutableArray *beeArray; 
@property(retain,nonatomic) NSMutableArray *beeanimArray; 
@property(retain,nonatomic) UIImageView *beeView; 
@property(retain,nonatomic) CALayer *beeLayer; 
@property(retain,nonatomic)CABasicAnimation *animat; 
-(void) animate; 
-(void) makeSwarm; 


@end 

ViewController.m

-(void) makeSwarm{ 

    self.view.layer.backgroundColor = [UIColor orangeColor].CGColor; 
    self.view.layer.cornerRadius = 20.0; 
    self.view.layer.frame = CGRectInset(self.view.layer.frame, 20, 20); 

    CGRect beeFrame; 
    beeArray = [[NSMutableArray alloc] init]; 
    beeImage = [UIImage imageNamed:@"bee50x55px.png"]; 
    beeFrame = CGRectMake(0, 0, beeImage.size.width, beeImage.size.height); 


    int i; 

    CALayer *p = [[CALayer alloc] init]; 


    for (i = 0; i < 3; i++) { 



     beeView = [[UIImageView alloc] initWithFrame:beeFrame]; 
     beeView.image = beeImage;  
     beeLayer = [beeView layer]; 
     [beeArray addObject: beeLayer]; 


     p = [beeArray objectAtIndex: i];  

     [p setPosition:CGPointMake(arc4random()%320, arc4random()%480)]; 
     [self.view.layer addSublayer:p]; 



    } 



    [self animate]; 

} 

-(void)animate 
{ 
    //the code from here to the end of this method is what I would like to repeat as many times as I would like 
    [CATransaction begin]; 

    int i; 
    for (i = 0; i < 3; i++) { 

     animat = [[CABasicAnimation alloc] init]; 
     [animat setFromValue:[NSValue valueWithCGPoint:CGPointMake(arc4random()%320, arc4random()%480)]]; 
     animat.toValue = [NSValue valueWithCGPoint:CGPointMake(arc4random()%320, arc4random()%480)]; 
     [animat setFillMode:kCAFillModeForwards]; 
     [animat setRemovedOnCompletion:NO]; 
     animat.duration=1.0; 


     CALayer *p = [[CALayer alloc] init]; 
     p = [beeArray objectAtIndex: i]; 
     [p addAnimation:animat forKey:@"position"]; 



    }  

    [CATransaction commit];  


} 
+0

나는 이것이 나 자신을 위해 대답했다고 믿는다. 루프의 끝에서 (i == 2 일 때) 애니메이션의 델리게이트를 설정하고 애니메이션이 끝날 때 (loop가 끝났음을 나타낼 때), animationDidStop 메소드에서 메소드를 다시 애니메이트합니다. 이것보다 더 우아하고 문제가없는 해결책이 있다면, 나는 모든 귀이고 대답으로 받아 들일 것입니다. –

답변

2

나는 나 자신이 대답했다 생각합니다. 루프의 끝에서 (i == 2 일 때) 애니메이션의 델리게이트를 설정하고 애니메이션이 끝날 때 (loop가 끝났음을 나타낼 때), animationDidStop 메소드에서 메소드를 다시 애니메이트합니다. 이것보다 더 우아하고 문제가없는 해결책이 있다면, 나는 모든 귀이고 대답으로 받아 들일 것입니다.

+0

누군가 내가 위에 언급 한 코드를 필요로 할 경우, 이것을 삽입하십시오 : animat.duration = 2; if (i == 0) animat.delegate = 자기; (void) animationDidStop : (CAAnimation *) theAnimation finished : (BOOL) flag {[self animate];} –

+0

스택은 결국 애니메이션의 메소드 호출로 채워 집니까? –