2013-12-08 36 views
0

我有一個視圖,它是一個4x4的圖像網格,我試圖實現每個方塊的效果,從上到下,從左到右,翻轉顯示一個新的圖像。應該是一個「漣漪」效應,所以左上方正方形立即開始翻轉,0.05秒後的[0,1]方塊翻轉,0.10秒後的[0,2]等等,以便在(0.05 * 15)秒,最終的方塊開始翻轉。[UIView transitionWithView ...]的快速系列不順利

我的實現是這樣的:每個方格是一個UIView子類,DMGridSquareView,其中包含一個UIImageView,而下面的方法:

- (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