2011-11-08 4 views
2

나는 여러 개의 애니메이션을 가진 앱을 가지고 있는데, 단순한 이미지이고, 단지 이미지가 오프 스크린에서 화면으로 이동 한 다음 오프 스크린으로 돌아 간다. 애니메이션 블록을 사용하고 있는데 코드는 다음과 같습니다.objective-c, 애니메이션 블록 무작위 화

void (^animationOne) (void) = ^{imageOne.center = d;}; 
void (^afterOne) (BOOL) = ^(BOOL f) {imageOne.center = dOrig;}; 
[UIView animateWithDuration:.85 delay:3 options:opts animations:animationOne completion:afterOne]; 

다소 차이가있는 형식이 여러 가지 있습니다. 그러나, 나는 그들이 무작위로 나타나는 순서를 원한다. 문제의 일부는 애니메이션과 완성 블록이 서로 관련이 있고 필요하다는 것입니다. 따라서 애니메이션을 배열에 집어 넣고 셔플 한 다음 애니메이션에 사용할 수는 없습니다. 애니메이션 블록을 사용하여 무작위로 추출 할 수있는 방법이 있습니까? 그렇지 않은 경우 순서를 임의화할 수 있도록 다른 방법이 있습니까? 감사.

편집 : vikingosegundo에서 몇 가지 유용한 제안 덕분에, I는 다음과 같이 사용하려면 코드를 변경했습니다

지금은 프로그램이 신호를 수신 한 수신하고 있습니다 그러나
NSArray *animationsCompletions = [NSArray arrayWithObjects: 
            [NSDictionary dictionaryWithObjectsAndKeys:anim1,@"animation",after1, @"completion", nil], 
            [NSDictionary dictionaryWithObjectsAndKeys:anim2,@"animation",after2, @"completion", nil], 
            [NSDictionary dictionaryWithObjectsAndKeys:anim3,@"animation",after3, @"completion", nil], 
            [NSDictionary dictionaryWithObjectsAndKeys:anim4,@"animation",after4, @"completion", nil], 
            nil]; 

NSDictionary *animationCompletionPair = [animationsCompletions randomElement]; 


[UIView animateWithDuration:.85 delay:3 options:opts animations:[animationCompletionPair objectForKey:@"animation"] completion:[animationCompletionPair objectForKey:@"completion"]]; 
[UIView animateWithDuration:.85 delay:8 options:opts animations:[animationCompletionPair objectForKey:@"animation"] completion:[animationCompletionPair objectForKey:@"completion"]]; 
[UIView animateWithDuration:.85 delay:13 options:opts animations:[animationCompletionPair objectForKey:@"animation"] completion:[animationCompletionPair objectForKey:@"completion"]]; 
[UIView animateWithDuration:.85 delay:18 options:opts animations:[animationCompletionPair objectForKey:@"animation"]completion:[animationCompletionPair objectForKey:@"completion"]]; 

: EXC_BAD_ACCESS 오류를 할 때 볼 수있는 애니메이션이로드하려고 시도하고 컴파일러에서 다른 정보를 제공하지 않습니다. 모든 제안을 부탁드립니다.

답변

3

애니메이션 및 완료 블록을 배열 (또는 둘)로 고정하십시오. 배열을 셔플하는 대신 무작위로 인덱스를 선택하고 해당 애니메이션 블록을 실행하십시오. 두 배열을 사용하여 예를 들어

:

NSArray *animations = [NSArray arrayWithObjects:animation1, animation2, animation3, nil]; 
NSArray *completions = [NSArray arrayWithObjects:completion1, completion2, completion3, nil]; 
int i = arc4random() % 3; 
[UIView animateWithDuration:.85 
         delay:3 
        options:opts 
        animation:[animations objectAtIndex:i] 
       completion:[completions objectAtIndex:i]]; 

각 애니메이션 다음, 한 번만 실행 인덱스의 두 번째 배열을 만들고 N-0에서 1로 숫자를 초기화 할 경우

. 그런 다음 해당 배열을 섞어 각 위치에서 찾은 색인의 애니메이션을 실행하여 반복합니다.

1

Caleb's answer이 맞지만 코드 반복을 피하고 테스트 된 코드를 다시 사용하기 위해 무작위 요소를 얻기 위해 NSArray에서 category method을 사용하는 것을 고려해야합니다.

[array randomElement];은 다음과 같이 될 수있다 :

-(id)randomElement 
{ 
    if ([self count] < 1) return nil; 
    NSUInteger randomIndex = arc4random() % [self count]; 
    return [self objectAtIndex:randomIndex]; 
} 

당신은 내 arraytools에있는 NSArray에이 구현 및 다른 편리한 도구를 찾을 수 있습니다.

이 경우 배열은 애니메이션 및 완료 블록 쌍으로 채워집니다.

NSArray *animationsCompletions = [NSArray arrayWithObjects: 
             [NSDictionary dictionaryWithObjectsAndKeys:animation1,@"animation",completion1, @"completion", nil], 
             [NSDictionary dictionaryWithObjectsAndKeys:animation2,@"animation",completion2, @"completion", nil], 
             [NSDictionary dictionaryWithObjectsAndKeys:animation3,@"animation",completion3, @"completion", nil], 
            nil]; 


NSDictionary *animationCompletionPair = [animationsCompletions randomElement]; 

[UIView animateWithDuration:.85 
         delay:3 
        options:opts 
        animation:[animationCompletionPair objectForKey:@"animation"] 
       completion:[animationCompletionPair objectForKey:@"completion"]]; 
+0

오케이, 나는 이것을 시험해보고 작동 여부를 다시 알려 드리겠습니다. 감사합니다! :) – lunadiviner

+0

나를 믿어, 그것 작품 :) – vikingosegundo

+0

물론,이 코드와 함께 애니메이션과 완성을 연결하려면 하나의 컬렉션에 하나의 애니메이션과 하나의 완료를 수집하고 이것을 배열에 넣어야합니다. – vikingosegundo