2012-09-25 90 views
3

Im嘗試將紅色方塊從視圖頂部移動到視圖底部的隨機位置,並在隨機位置再次返回頂部。 該應用程序使用以下代碼開始到[超級viewLoad]:IOS動畫不能與我的動畫塊一起工作

[redSquare setCenter:CGPointMake(25,25)]; 

(與紅色正方形視圖組50×50,這與開始在左上角的redsquare的應用程序)。

動畫的第一部分效果很好 - 紅色正方形動畫到隨機位置到頁面底部。但是,它隨後跳躍到一個隨機的位置而沒有動畫。 請幫助我做錯了什麼或任何其他解決方案來幫助這個簡單的動畫。

-(void)moving{ 

    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^{ 
    int randomx = arc4random() % 295; 
    [redSquare setCenter:CGPointMake(randomx,435)]; 


    } completion:^(BOOL finished) { 

    [redSquare setCenter:CGPointMake(redSquare.frame.origin.x,25)]; 
    }]; 

} 

回答

3

,你應該在完成塊的開始新的動畫例如:

completion:^(BOOL finished) { 
      [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn  animations:^{ 
      int randomx = arc4random() % 295; 
      [redSquare setCenter:CGPointMake(randomx,25)]; 


    } completion:^(BOOL finished) { 


    }]; 
    }]; 
+0

感謝您的建議 - 我喜歡從sheraza的建議,因爲它似乎是最合理的給我。我在上面的代碼中添加了一個定時器,紅色方塊現在可以按照預期進行動畫了。 – pete

1

這部分確實你所描述的正是:

completion:^(BOOL finished) { 
    [redSquare setCenter:CGPointMake(redSquare.frame.origin.x,25)]; 
} 

即將對象返回到屏幕頂部之後該分析完成。這不會被動畫化,它會在動畫完成後發生,因此它會立即生效。

您需要在動畫完成後觸發新的動畫。

要創建但是幾個嵌套的動畫塊可以變得有點凌亂,最乾淨的方法是創建另一個方法動畫回來的時候調用它的第一個動畫完成,像這樣:

-(void) moveDown{ 
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^{ 
     int randomx = arc4random() % 295; 
     [redSquare setCenter:CGPointMake(randomx,435)]; 

    } completion:^(BOOL finished) { 
     // First animation completed 
     [self moveBack]; 
    }]; 
} 

-(void) moveBack{ 
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^{ 
     [redSquare setCenter:CGPointMake(redSquare.frame.origin.x,25)]; 
    } completion:^(BOOL finished) { 
     // Second animation completed 
    }]; 
} 
+0

使用塊的要點是避免使用回調。 – Abizern

+0

避免回調的主要原因是什麼?在我看來,塊表示法與較早的「beginanimations」表示法相比,一個優點是你可以避免使用選擇器,因爲選擇器沒有被編譯器驗證。 –

+0

因爲它將發生事件的邏輯與發起它的代碼分開。因此,它不那麼有凝聚力的夾頭和更多的bug。另外還有一種隱式契約,即一種方法在某種程度上是通用的,可重用的,而且在這些情況下通常不是。 – EricLeaf

4

你完成模塊只是設置新的位置。你是不是動畫回頂:

試試這個,而不是

-(void)moving { 

    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^{ 
     int randomx = arc4random() % 295; 
     [redSquare setCenter:CGPointMake(randomx,435)]; 
    } completion:^(BOOL finished) { 
     [UIViewAnimateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^{ 
     [redSquare setCenter:CGPointMake(redSquare.frame.origin.x,25)]; 
     } completion: NULL 
    }]; 

} 

編輯補充

這是真的,能級可能會比較混亂,但你可以讓生活簡單,如果您與方法分開定義塊,則縮進較少。

例如,你可以把上面的爲:

-(void)moving { 

    workBlk_t animationBlock =^{ 
     int randomx = arc4random() % 295; 
     [redSquare setCenter:CGPointMake(randomx,435)]; 
    }; 

    void (^completionBlock)(BOOL finished) = ^{ 
     [UIViewAnimateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^{ 
      [redSquare setCenter:CGPointMake(redSquare.frame.origin.x,25)]; 
     } completion : NULL 
    }; 

    [UIView animateWithDuration:1.0 
          delay:0.0 
         options:UIViewAnimationCurveEaseIn 
        animations:animationBlock 
        completion:completionBlock 
    }]; 

} 
+0

然而,像這樣的嵌套可能會變得非常混亂,如果在稍後的第二個動畫完成後他需要創建另一個動畫。 –

+0

編輯後更好=) –