7

我有一個視圖控制器,它在其視圖的給定區域中顯示2個子視圖控制器的視圖。 2個子視圖控制器是FlopVC和FipVC。transitionFromView:toView:duration:options:completion:沒有爲轉換設置動畫

我想動畫從一個子視圖過渡到另一個。我使用的代碼是:

-(IBAction)flip:(id)sender{ 

    UIViewController *newVC = nil; 

    if (self.isFlip) { 
     newVC = [[FlopVC alloc] initWithNibName:nil bundle:nil]; 
    }else{ 
     newVC = [[FipVC alloc] initWithNibName:nil bundle:nil]; 
    } 

    newVC.view.frame = CGRectMake(120, 20, 240, 260); 
    [self.view addSubview:newVC.view]; 

    [UIView transitionFromView:self.currentVC.view 
         toView:newVC.view 
         duration:0.9 
         options:UIViewAnimationTransitionFlipFromLeft 
        completion:^(BOOL finished) { 
         self.currentVC = newVC; 
         self.isFlip = ! self.isFlip; 
        }]; 



} 

子視圖被交換,但沒有任何動畫。我究竟做錯了什麼?

PS整個項目是here

回答

19
UIViewAnimationTransitionFlipFromLeft != UIViewAnimationOptionTransitionFlipFromLeft
+1

我有可怕的感覺,這是愚蠢的,但不知道這是不好的。 :-P我在下一個@nscoder_mad – cfischer

+0

欠你一杯啤酒哈,哈...這很棘手,我每週都會犯更多愚蠢的錯誤。我會接受啤酒:) – djromero

+2

Ruddy地獄,我只是犯了同樣的錯誤。謝謝Google + stackoverflow! :)(和madmw當然!) –

3

如果你使用,你需要沿着以下的線路做一些新的iOS5視圖容器範式:

-(IBAction)flip:(id)sender{ 

    UIViewController *newVC = nil; 

    if (self.isFlip) { 
     newVC = [[FlopVC alloc] initWithNibName:nil bundle:nil]; 
    }else{ 
     newVC = [[FipVC alloc] initWithNibName:nil bundle:nil]; 
    } 

    newVC.view.frame = CGRectMake(120, 20, 240, 260); 

    // required for the new viewController container 
    self.currentVC willMoveToParentViewController:nil]; 
    [self addChildViewController:newVC]; 
    [self transitionFromViewController:self.currentVC 
        toViewViewController:newVC.view 
           duration:0.9 
           options: UIViewAnimationOptionTransitionFlipFromLeft 
          animations:nil 
          completion:^(BOOL finished) { 
           // required for the new viewController container 
           [self.currentVC removeFromParentViewController]; 
           [newVC didMoveToParentViewController:self]; 

           self.currentVC=newVC; 
          }]; 



} 

參考部分Implementing a Container View Controller和更多的信息上的UIViewController容器2011年WWDC的視頻。

+0

關於「動畫」參數,文檔狀態「此參數不能爲NULL」。你好, – benvolioT

+0

。它不是NULL,而是零,它直接來自Apple示例代碼。每個文檔:「一個塊對象,包含對視圖提交的改變,在這裏你以編程方式改變視圖層次結構中所有視圖的動畫屬性,這個塊沒有參數,也沒有返回值,這個參數不能爲NULL。 「你可以發送零,因爲你可以發送消息到零。您不能將消息發送到NULL。 – timthetoolman

+0

感謝您的澄清 - 我的Java根源在那裏展示。 :) – benvolioT

2

這裏是工作代碼,(純屬巧合)完全按照你所描述的。我的兩個孩子vc存儲在self->swappers。整數cur跟蹤當前顯示的是哪一個。子視圖所在界面中的位置由視圖插座panel標記。

UIViewController* fromvc = [self->swappers objectAtIndex:cur]; 
cur = (cur == 0) ? 1 : 0; 
UIViewController* tovc = [self->swappers objectAtIndex:cur]; 
tovc.view.frame = self.panel.bounds; 

// must have both as children before we can transition between them 
[self addChildViewController:tovc]; // "will" called for us 
// note: when we call remove, we must call "will" (with nil) beforehand 
[fromvc willMoveToParentViewController:nil]; 

[self transitionFromViewController:fromvc 
        toViewController:tovc 
          duration:0.4 
          options:UIViewAnimationOptionTransitionFlipFromLeft 
         animations:nil 
         completion:^(BOOL done){ 
          // note: when we call add, we must call "did" afterwards 
          [tovc didMoveToParentViewController:self]; 
          [fromvc removeFromParentViewController]; // "did" called for us 
         }];