2012-05-11 133 views
15

我知道一噸的人都問了同樣的問題,但沒有提出的解決方案似乎相關,所以我再次問: 我有下面的代碼塊:animateWithDuration立即完成

UIImageView *moneyHolder = [[UIImageView alloc] initWithImage:moneyImage];  
if([paymentMethod.viewed intValue] == 0){ 
      //CGRect targetFrame = CGRectMake(0, cell.frame.size.height/2-3, cell.frame.size.width, targetHeight); 
      CGRect targetFrame = moneyHolder.frame; 
      targetFrame.origin.y = cell.frame.size.height/2-3; 
      NSLog(@"animating"); 
      [UIView animateWithDuration:2 
            delay:0 
           options: UIViewAnimationCurveEaseOut 
          animations:^{ 
           moneyHolder.frame = targetFrame; 
          } 
          completion:^(BOOL finished){ 
           NSLog(@"done"); 
          } 
      ]; 
     } 

我會認爲應該動畫我的錢箱框架。不幸的是,這似乎是立即發生的,而不是持續2秒。

2012-05-11 03:41:50.102 AgilePoet [5824:15203]動畫
2012-05-11 03:41:50.116 AgilePoet [5824:15203]已完成,我可以從我的日誌時間戳驗證這一點

有沒有人有任何想法,爲什麼這可能會發生?關於此主題的所有其他問題都集中在該屬性不具動畫性,但我知道一個imageview框架具有動畫能力。我唯一能想到的就是這段代碼寫在我的內部

-tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath method. 

在此先感謝!

+0

很高興看到你有什麼可能導致問題的理論。你可以通過將動畫代碼臨時複製到別的地方來測試它,看看它是否像你期望的那樣行事? –

+0

以及我移動了willDisplayCell方法之外的代碼,它的工作......有誰知道爲什麼它不會在willDisplayCell內工作? – akhalsa

+0

我的猜測是willDisplayCell的繪圖代碼會調用單元圖層上的removeAllAnimations,從而過早地結束您的動畫。 –

回答

17

引述文檔:

幀中的框架矩形,它描述了圖的位置和大小 在它的父的座標系統。

此屬性的更改可以爲動畫。但是,如果變換 屬性包含非標識轉換,則框架 屬性的值未定義,因此不應修改。在這種情況下,您可以使用中心屬性重新定位視圖,並使用bounds屬性調整大小 。

如果您或其他代碼已更改視圖的轉換矩陣,則對幀屬性所做的更改無法按預期工作。

您應該改變中心屬性(移動視圖)和邊界屬性(改變它的大小)。這些屬性的行爲如預期。

+0

好引用! ;) – Daniel

+0

我總是喜歡動畫/改變中心屬性,而不是frame.origin。不僅僅是因爲提到的問題,還因爲它更直觀。(另外,iOS/Mac OS的frame.origin位置不同) –

+1

使用'center'作爲定位屬性時必須注意的事項如果你的框架有一個奇怪的像素寬度或高度。在這種情況下將中心設置爲整數座標將導致視圖變得模糊,因爲它不會像素對齊。 –

0

導致動畫立即完成的另一件事是,如果被動畫的對象(在我的情況下爲UIImageView)爲零。

4

在我的情況下,動畫在viewdidload方法中調用。不要這樣做。試一試viewWillAppear

相關問題