2009-09-21 6 views
5

저는 작업중인 카드 게임에 기본 애니메이션을 추가하고 있습니다. (내 첫 번째 아이폰 앱)애니메이션을 시작하기 전에 iPhone 애니메이션 컨테이너보기 수정하기

rect1에서 rect2로 이동하면서 image1에서 image2로 넘겨주는 사용자 정의 UIView 클래스 "AnimationContainer"를 만들었습니다. 나의 궁극적 인 목적은 동시에 4 가지 컨테이너를 동시에 전환하는 것입니다.

내가 겪고있는 문제는 애니메이션이 image1을 표시하지 않는다는 것입니다. 따라서 뒤집기 전환의 마지막 절반 만 나타납니다.

그러나 초기화를 터치하여 애니메이션을 처음 재설정하면 모든 것이 완벽하게 작동합니다. 다시 말하면, Flip을 반복해서 누르면, 나는 전환의 절반 만 얻습니다. 그러나 Reset을 먼저 누르면, 모든 것이 한 플립을 위해 완벽하게 작동합니다.

그래서 어떻게 애니메이션을 올바르게 재설정 할 수 있습니까?

다음은 코드, 스크린 샷 및 전체 링크입니다 : Project Zip File 700k.

alt text http://www.robsteward.com/cardflip.jpg

- (void)displayWithImage1 {  //RESET button calls this 
    self.frame = rect1; 
    [image2 removeFromSuperview]; 
    [self addSubview:image1]; 
    [self setNeedsDisplay]; //no help: doesn't force an update before animation 
} 

- (void)runTheAnimation {  //FLIP button calls this 
    [self displayWithImage1]; //<---this is what the reset button calls 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:transition forView:self cache:NO]; 
    self.frame = rect2; 
    [image1 removeFromSuperview]; 
    [self addSubview:image2]; 
    [UIView commitAnimations]; 
} 

감사합니다!

+0

나는 반쯤 생생한 해결 방법을 생각해 냈습니다. 나는 "더미"애니메이션을 추가하고 클래스를 setAnimationDidStopSelector에 대한 델리게이트로 만들었습니다. 더미 애니메이션은 지속 시간이 0.0이고 뷰를 rect1로 이동합니다. 더미의 스톱 선택기가 호출되면, 거기에서 "실제"애니메이션 플립 코드를 수행합니다. 완전히 작동하며 적어도 4 개가 동시에 실행될 수 있습니다. 예, 저요. LOL – Rob

+1

해결 방법으로 인해 최대 0.5 초의 지연이 발생할 수 있으므로 현상금을 시작합니다. 하나의 전환에서 두 개의 이미지를 컨테이너보기로 보내고 한 이미지를 다음 이미지로 넘기는 방법이 있어야합니다. – Rob

답변

12

애니메이션을 수행하기 전에보기를 다시 그리려면 전달하기 위해 그리기 루프가 필요합니다. 이 코드는 "이것을 그리면 다음 이벤트 루프가 돌아올 때 다른 일을하십시오"라는 예입니다. UI 코드에서이를 수행하는 것이 일반적입니다. 첫 번째 해결 방법은 똑같은 시도이지만 훨씬 더 복잡한 방식입니다.

- (void)_runTheAnimation { 
    // Moved here from -runTheAnimation 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:transition forView:self cache:NO]; 
    self.frame = rect2; 
    [image1 removeFromSuperview]; 
    [self addSubview:image2]; 
    [UIView commitAnimations]; 
} 

- (void)runTheAnimation {  //FLIP button calls this 
    [self displayWithImage1]; 
    [self performSelector:@selector(_runTheAnimation) withObject:nil afterDelay:0.0]; 
} 
+1

굉장! 정말 고맙습니다. 선별자가 즉시 실행되지 않는다는 것이 명확하지 않았습니다. 모든 것이 잘되고 있습니다. 200 rep bounty는 지불 할 작은 가격이었습니다. 나는 이것을 어지럽히는 데 10 시간을 보냈다. – Rob

+1

(-peformSelector :)를 요청하면 선택자가 즉시 전송됩니다. 위의 방법은 나중에 실행될 선택기에 대한 실행 루프에서 예약하는 -performSelector : withObject : afterDelay :입니다. 지연 0은 효과적으로 "다음에 실행 루프가 반복 할 때"를 의미합니다. 셀렉터 자체는 객체에 전달할 메시지를 설명합니다. 해당 메시지를 전달하는 행위는 performSelector ... 메소드에 의해 수행됩니다. –

+1

멋지다, 나는 이해한다고 생각한다. 여전히 코코아, Objective-C 및 모든 것들에 속도를 내고있는 아이폰 ... 그러나 나는 지금 더 빨리 배우고 있습니다. 다시 한번 감사드립니다. – Rob

관련 문제