2009-01-09 69 views
38

在我的iPhone應用程序中,我在UIToolBar中放入了一個UIBarButtonSystemItemTrash類型的UIBarBUtton。當按下時,我想複製Mail.app的動畫:bin打開,UIView摺疊並飛入它。
有沒有辦法通過iPhone SDK訪問這個動畫?如何複製Mail.app的垃圾動畫

目前我使用的是定製動畫,但有一些限制;例如,我無法爲垃圾箱本身製作動畫。 你有什麼建議嗎?代碼示例?

乾杯,
達維德

+8

於是,鄉親們:如何做,沒有私有API? – dontWatchMyProfile 2010-05-23 18:18:15

+0

嗨nutsmuggler 如果我嘗試相同的動畫我沒有得到如何摺疊曲線,而移動...... 如果可能告訴如何做到這一點 – 2011-01-18 14:34:04

+3

@jeeva哈哈我喜歡隨便你怎麼提他的名字 – 2011-06-30 12:59:23

回答

34

在動畫上使用suckEffect類型。另外:spewEffect,genieEffect,unGenieEffect,twist,tubey,swirl,cameraIris,cameraIrisHollowClose,cameraIrisHollowOpen,rippleEffect,charminUltra,zoomyIn和zoomyOut。在模擬器中不起作用。

CATransition *animation = [CATransition animation]; 
animation.type = @"suckEffect"; 
animation.duration = 2.0f; 
animation.timingFunction = UIViewAnimationCurveEaseInOut; 
view.opacity = 1.0f; 
[view.layer addAnimation:animation forKey:@"transitionViewAnimation"]; 

注意:代碼片段是從更大的代碼庫中提取的。我希望它的工作原理:)

10

不幸的是,我認爲這將需要是一個完全自定義動畫。 UIView摺疊可以使用核心動畫進行近似,也許通過向UIView的底層的CATransform3D添加透視圖來將UIView扭曲成被吸入垃圾桶的梯形。

就垃圾桶而言,您可以使用initWithCustomView創建一個UIBarButtonItem :,它可以讓您插入一個具有動畫垃圾桶的自定義UIView。它看起來像垃圾桶有兩個元素,罐底和蓋子,它們獨立旋轉以打開和關閉罐子。爲兩者繪製PNG,爲它們製作UIImageView,並使它們成爲UIBarButtonItem自定義視圖的子視圖。對於打開和關閉,應用旋轉變換來爲子視圖設置動畫。

+1

我害怕我會得到這個答案:) 我擔心的一件事是複製蘋果的應用程序beahviour太密切有人可能會因爲指責使用私有API而拒絕他的應用。另外,我不舒適地抓住蘋果自己的垃圾箱並修飾它,但也許我只是一隻可怕的貓。 – nutsmuggler 2009-01-10 10:22:37

11

我想補充一些信息:

  1. 您可以使用「suckEffect」與標準+[UIView setAnimationTransition:forView:cache:]。只需將數字103傳遞給animationTransition變量即可。這不會避免你的應用被蘋果拒絕:p
  2. 「spewEffect」,「genieEffect」,「unGenieEffect」等不再存在於iPhoneOS 3.x上。剩下的唯一沒有文檔的轉換是「立方體」( - ),「rippleEffect」(110),三個「cameraIris」效果(105,106,107)和「suckEffect」(103)。

有關詳細信息,請參見http://www.iphonedevwiki.net/index.php?title=UIViewAnimationState

此外,要使用私有API對動畫進行動畫處理:http://www.iphonedevwiki.net/index.php?title=UIToolbar#Animating_the_trash_can_icon

4

我不確定這是否是答案,但here是做「精靈效應」的lib,因此它與您想要達到的效果非常相似。

CGRect endRect = CGRectMake(30, 40, 50, 60); 
[view genieInTransitionWithDuration:0.7 
        destinationRect:endRect 
        destinationEdge:BCRectEdgeTop 
         completion:^{ 
          NSLog(@"I'm done!"); 
          }]; 

Genie IN