2010-04-12 75 views
2

我在我的iPhone應用程序,這樣的一些代碼:爲什麼新的UIImageView無法動畫?

//fromView is a UIImageView. 
//self is a UIView. 
     UIGraphicsBeginImageContext(fromView.bounds.size); 
     [fromView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
     UIImage *dummyFromImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
     UIImageView* dummyImageView = [[UIImageView alloc] initWithImage:dummyFromImage]; 
     [self addSubview:dummyImageView]; 
     [UIView beginAnimations:nil context:nil]; 
     [UIView setAnimationDuration:0.5]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView: dummyImageView cache:YES]; //line:9 
     [UIView commitAnimations]; 

的dummyImageView只能說明,但從來沒有翻轉,如果你改變line9的dummyImageView到fromView,fromView做翻轉,請告訴我爲什麼?

回答

3

我問這個問題,蘋果開發人員技術支持,他們說,

「的基本問題是因爲動畫的時機,有沒有‘以前’狀態核心動畫從動畫,作爲視圖只是添加到視圖層次結構中,所以當嘗試轉換時,只能顯示「最終」狀態。

如果您在下一個runloop迭代中執行翻轉操作,則Core Animation將具有有時間爲視圖的層創建一個初始狀態,因此flip將正確地發生,你可以通過將你的flip方法分成兩部分並使用-performSelector:withObject:afterDelay來完成:像這樣: 「

-(IBAction)flip { 

    UIImageView* dummyImageView = [[UIImageView alloc] initWithImage:fromView.image]; 
    dummyImageView.frame = fromView.frame; 
    [window addSubview:dummyImageView]; 

    [self performSelector:@selector(animate:) withObject:dummyImageView afterDelay:0.0]; 
} 

-(void)animate:(UIView*)view { 

    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView: view cache:YES]; 
    [UIView commitAnimations]; 
} 

不過,既然你提到‘fromView’是一個UIImageView,我不知道爲什麼你正在使用-renderInContext: - 這是更有效的方法簡單地使用相同的圖像‘fromView’使用和分配它作爲新的UIImageView的圖像,因爲這可以節省CPU時間和內存,特別是因爲我注意到您的示例中圖像比您使用的視圖更小。

1
[UIView setAnimationTransition:… forView: dummyImageView cache:YES]; //line:9 

-setAnimationTransition:…方法的視圖應該被分配到該包含的變化的圖。在你的情況下,self

dummyImageView本身沒有改變(外觀改變如改變superview是無關緊要的),所以動畫無能爲力。