2011-10-08 34 views
1

我对这个东西还比较陌生。这个程序只是我的第二个。UITabBarController - 如何动画简单开关?

我有一个TabBarController,有意见之间切换两种方式:

方法1:使用Tab栏图标。我提供了必要的代理回调。这是这样的:

/***************************************************************\** 
\brief This animates the view transitions, and also sets up anything 
that needs doing between views. 
*****************************************************************/ 
- (BOOL)tabBarController:(UITabBarController *)inTabBarController 
shouldSelectViewController:(UIViewController *)inViewController 
{ 
    BOOL ret = NO; 

     // Need to have all of these to work. 
    if (inTabBarController && [inTabBarController view] && inViewController && [inViewController view]) 
     { 
     UIView *srcView = [[inTabBarController selectedViewController] view]; 
     UIView *dstView = [inViewController view]; 

     if (srcView != dstView) 
      { 
      if (srcView == [prefsController view]) 
       { 
       [UIView transitionFromView:srcView 
            toView:dstView 
            duration:0.25 
            options:UIViewAnimationOptionTransitionCurlDown 
           completion:nil]; 
       } 
      else if (dstView == [prefsController view]) 
       { 
       [UIView transitionFromView:srcView 
            toView:dstView 
            duration:0.25 
            options:UIViewAnimationOptionTransitionCurlUp 
           completion:nil]; 
       } 
      else if (srcView == [listSearchController view] && dstView == [mapSearchController view]) 
       { 
       [UIView transitionFromView:srcView 
            toView:dstView 
            duration:0.25 
            options:UIViewAnimationOptionTransitionFlipFromLeft 
           completion:nil]; 
       } 
      else if (dstView == [listSearchController view] && srcView == [mapSearchController view]) 
       { 
       [UIView transitionFromView:srcView 
            toView:dstView 
            duration:0.25 
            options:UIViewAnimationOptionTransitionFlipFromRight 
           completion:nil]; 
       } 

      ret = YES; 
      } 
     } 

    return ret; 
} 

伟大的作品。

方法2:抢挥笔,并触发转换这种方式,就像这样:

/***************************************************************\** 
\brief Gesture Callback -Swipes from the List View to the Map View 
*****************************************************************/ 
- (IBAction)swipeFromList:(UIGestureRecognizer *)sender 
{ 
    [tabBarController setSelectedIndex:1]; 
} 

这里的问题是,我不能到工作的过渡。如果我的转换代码添加到刷卡处理,像这样:

/***************************************************************\** 
\brief Gesture Callback -Swipes from the List View to the Map View 
*****************************************************************/ 
- (IBAction)swipeFromList:(UIGestureRecognizer *)sender 
{ 
    [UIView transitionFromView:[listSearchController view] 
         toView:[mapSearchController view] 
         duration:0.25 
         options:UIViewAnimationOptionTransitionFlipFromLeft 
        completion:nil]; 
    [tabBarController setSelectedIndex:1]; 
} 

它的工作原理是第一次,但出现眼睛蛇在随后的那张。

我敢肯定,我在这里做了一些基本的,微笑的错误,并且正在寻找线索。

线索,有人吗?

谢谢!

回答

3

哇。我解决了它,我不完全确定为什么,但它的工作原理。

这里就是我所做的:

首先,我分解转变成标准的方法:

/***************************************************************\** 
\brief Manages the transition from one view to another. Just like 
it says on the tin. 
*****************************************************************/ 
- (void)transitionBetweenThisView:(UIView *)srcView 
         andThisView:(UIView *)dstView 
{ 
    if (srcView != dstView) 
     { 
     if (srcView == [prefsController view]) 
      { 
      [UIView transitionFromView:srcView 
           toView:dstView 
           duration:0.25 
           options:UIViewAnimationOptionTransitionCurlDown 
          completion:nil]; 
      } 
     else if (dstView == [prefsController view]) 
      { 
      [UIView transitionFromView:srcView 
           toView:dstView 
           duration:0.25 
           options:UIViewAnimationOptionTransitionCurlUp 
          completion:nil]; 
      } 
     else if (srcView == [listSearchController view] && dstView == [mapSearchController view]) 
      { 
      [UIView transitionFromView:srcView 
           toView:dstView 
           duration:0.25 
           options:UIViewAnimationOptionTransitionFlipFromLeft 
          completion:nil]; 
      } 
     else if (dstView == [listSearchController view] && srcView == [mapSearchController view]) 
      { 
      [UIView transitionFromView:srcView 
           toView:dstView 
           duration:0.25 
           options:UIViewAnimationOptionTransitionFlipFromRight 
          completion:nil]; 
      } 
     } 
} 

接下来,我拦截标签栏过渡发生之前,并覆盖它,就像这样:

/***************************************************************\** 
\brief This animates the view transitions, and also sets up anything 
that needs doing between views. It stops the tab bar controller 
from managing the transition, and does it manually. 
\returns a BOOL. Always NO. 
*****************************************************************/ 
- (BOOL)tabBarController:(UITabBarController *)inTabBarController 
shouldSelectViewController:(UIViewController *)inViewController 
{ 
    [self transitionBetweenThisView:[[inTabBarController selectedViewController] view] andThisView:[inViewController view]]; 
    int index = [[inTabBarController viewControllers] indexOfObject:inViewController]; 
    [inTabBarController setSelectedIndex:index]; 
    return NO; 
} 

然后,添加以下代码到滑动陷阱:

/***************************************************************\** 
\brief Gesture Callback -Swipes from the List View to the Map View 
*****************************************************************/ 
- (IBAction)swipeFromList:(UIGestureRecognizer *)sender 
{ 
    [self transitionBetweenThisView:[listSearchController view] andThisView:[mapSearchController view]]; 
    [tabBarController setSelectedIndex:1]; 
} 

现在,这里的问题是,当我回到我已经刷过的视图(不使用标签栏)时,我总是发生崩溃。坠机说目的地视图已被释放。

检查一些鸡内脏后,我决定,我需要保持我的鼻子,并保留先前的观点,就像这样:

[[listSearchController view] retain]; 
    [self transitionBetweenThisView:[listSearchController view] andThisView:[mapSearchController view]]; 

工程。我用仪器检查过。没有泄漏。

+0

一个关于这个解决方案真的很烦人的事情是,它呈现分析机构几乎一文不值,因为在每一个这些分析尖叫。 –

2

此代码工作正常 **

int controllerIndex = 2; 
UIView * fromView = self.tabBarController .selectedViewController.view; 
UIView * toView = [[self.tabBarController.viewControllers objectAtIndex:controllerIndex] view]; 

// Transition using a page curl. 
[UIView transitionFromView:fromView toView:toView duration:0.5 
        options:(controllerIndex > self.tabBarController.selectedIndex ? UIViewAnimationOptionTransitionCurlUp : UIViewAnimationOptionTransitionCurlDown) 

       completion:^(BOOL finished) { 

        if (finished) { 
         self.tabBarController.selectedIndex = controllerIndex; 
        } 

       }];** 
+0

这是一个好主意(完成块)。 –