2013-12-08 1 views
0

4x4 격자의 이미지를 얻었으며 모든 사각형의 효과를 얻기 위해 위에서 아래로 그리고 왼쪽에서 오른쪽으로 이동하려고합니다. , 새로운 이미지를 드러내 기 위해 뒤집었다. 약간의 "잔물결"효과가 있어야하므로 왼쪽 위 사각형이 바로 뒤집기 시작하여 [0,1] 사각형이 0.05 초 후, [0,2]가 0.10 초 후 등으로 뒤집 힙니다. * 15) 초 마지막 사각형이 뒤집기 시작합니다.[UIView transitionWithView ...]의 빠른 시리즈가 원활하게 진행되지 않음

내 구현은 이것이다 : 각 그리드 사각형은 UIView의 하위 클래스이다하는 UIImageView에 포함되어 DMGridSquareView, 다음과 같은 방법

- (void)flipToNewImage:(UIImage*)img { 
    AATileView *mySelf = self; 

    [UIView transitionWithView:self.imageView 
         duration:0.4 
         options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ 
            self.imageView.image = img; 
           } completion:^(BOOL finished) { 
            NSLog(@"Finished flip"); 
           }]; 
} 

그런 다음, 모든 그리드 사각형의 애니메이션을 트리거하기 위해, DMGridView 내에서이 메소드를 호출합니다.

- (void)flipAllSquares:(NSArray*)newImages { 
    int numTiles = self.numColumns * self.numRows; 
    for (int idx=0; idx<numTiles; idx++) { 
     UIImage *newImg = [newImages objectAtIndex:idx]; 
     [[self.gridSquareViews objectAtIndex:idx] performSelector:@selector(flipToNewImage:) withObject:newImg afterDelay:(0.05*idx)]; 
    } 
} 

시뮬레이터에서 실행하면이 기능이 아름답게 작동합니다. 하지만 내 iPhone 5에서 실행할 때 예상치 못한 (적어도 나에게는) 동작이 발생합니다. 개별 격자 사각형의 애니메이션은 매끄럽고 부드럽고 올바른 속도로 시작 시간이 꺼져 있습니다. 그들은 비틀 거리는 "덩어리"에서 일어난다. 따라서 첫 번째 2 칸이 즉시 뒤집을 수 있습니다. 그러면 다음 4 칸이 동시에 뒤집어 질 것이고, 다른 순간이 뒤 따르는 3 칸이 차례로 뒤따를 것입니다. 일관성이 없지만 항상 이렇게 덩어리입니다.

어떻게 해결할 수 있습니까?

감사합니다.

답변

0

편집 1 :

죄송합니다, 내가 질문을 오해 것 같습니다. 당신은 하나씩 뒤집기를 원하지 않습니다. 이전보기가 뒤집기 시작한 직후에 각보기가 뒤집기 시작하기를 원합니다.

완료 블록에서 메서드를 재귀 적으로 호출 해 보았습니까? 이 방법으로 이전 이미지가 플립 애니메이션을 완료 한 후에 메소드가 호출되고 있다는 것을 알 수 있습니다.

NSInteger imageFlipIndex = 0; 

- (void)flipToNewImage:(UIImage*)img { 
    AATileView *mySelf = self; 

    [UIView transitionWithView:self.imageView 
         duration:0.4 
         options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ 
            self.imageView.image = img; 
           } completion:^(BOOL finished) { 
            imageFlipIndex++; 
            if (imageFlipIndex < newImages.count) { 
             UIImage *newImg = [newImages objectAtIndex:idx]; 
             [self flipToNewImage:newImg]; 
            } else { 
             imageFlipIndex = 0;  
            } 
            NSLog(@"Finished flip"); 
           }]; 
} 

당신은 무엇을하려고하면 어떻게됩니까 : 애니메이션 내부

imageFlipIndex++; 
if (imageFlipIndex < newImages.count) { 
    UIImage *newImg = [newImages objectAtIndex:idx]; 
    [[self.gridSquareViews objectAtIndex:imageFlipIndex] performSelector:@selector(flipToNewImage:) withObject:newImg afterDelay:(0.05*idx)]; 
} else { 
    imageFlipIndex = 0;  
} 

차단?

+0

이전 문제가 끝날 때까지 기다리는 것을 원하지 않는다는 문제점이 있습니다. 그들은 "파도"효과처럼 빠른 연속적으로 시작해야합니다. – DanM

+0

게시 후 알게되었습니다. 미안합니다. 나는 이것을 숙고 해 왔고 시뮬레이터와 장치에서 다른 결과를 얻는 이유를 실제로 알지 못합니다. – Chris

+1

심지어 더 이상한, 그것은 갑자기 작동합니다. 나는 그 코드를 실제로 변경하지 않았기 때문에 나는 그것을 믿지 않는다 ... 그러나 여기서 이상한 일이있을 것이다. 이상한 점을 발견하면 다시 게시 할 것입니다 ... – DanM

관련 문제