hidesBottombarWhenPushed的隐藏与显示问题

http://stackoverflow.com/questions/5272290/how-to-hide-uitabbarcontroller

在UITabbarController包含的UINavigationController应用中,如果UINavigationController某一页(某个level)需要隐藏Tabbar,之前的做法是在push那一页之前,将那一页的ViewController中的hidesBottombarWhenPushed参数设为YES,这样当那一页push进UINavigationController中时,底部的Tabbar就会隐藏掉。

但是这种方法有一个潜在的而又巨大的问题,假设现在我有3个ViewController A,B,C,其中为Navigation的RootViewController,A中push B,B中push C。这时,如果我想要在B中隐藏Tabbar,而在C中显示Tabbar,根据最朴素的想法就是:

 

?
1
2
3
4
5
6
7
8
9
//SecondLevel即为B,此代码在A中进行
SecondLevelViewController *_2vc = [[SecondLevelViewController alloc]initWithNibName:@ "SecondLevelViewController" bundle: nil ];
     _2vc.hidesBottomBarWhenPushed = YES ;
     [ self .navigationController pushViewController:_2vc animated: YES ]; 
 
//ThirdLevel即为C,此代码在B中进行
ThirdLevelViewController *_3vc = [[ThirdLevelViewController alloc]initWithNibName:@ "ThirdLevelViewController" bundle: nil ];
     _3vc.hidesBottomBarWhenPushed = NO ;
     [ self .navigationController pushViewController:_3vc animated: YES ];

然而很可惜,虽然A中push B能让Tabbar隐藏,但是B中push C,就没办法让Tabbar显示出来了。这是一个比较郁闷的问题,我只能猜想其中的原理是,当设置某一层hidesBottomBarWhenPushed = YES之后,UITabbarController就像不存在一样,就连调用self.tabbarController或者self.navigationController.tabbarController也应该是nil。

所以解决办法只能是手动隐藏Tabbar。

在B中,加入以下代码:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
- ( void ) hideTabBar:(UITabBarController *) tabbarcontroller {
     [UIView beginAnimations: nil context: NULL ];
     [UIView setAnimationDuration:0.5];
     for (UIView *view in tabbarcontroller.view.subviews)
     {
         if ([view isKindOfClass:[UITabBar class ]])
         {
             [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
         }
         else
         {
             [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
         }
     }
     [UIView commitAnimations];
}
 
- ( void ) showTabBar:(UITabBarController *) tabbarcontroller {
 
     [UIView beginAnimations: nil context: NULL ];
     [UIView setAnimationDuration:0.5];
     for (UIView *view in tabbarcontroller.view.subviews)
     {
         NSLog (@ "%@" , view);
 
         if ([view isKindOfClass:[UITabBar class ]])
         {
             [view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)];
         }
         else
         {
             [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)];
         }
     }
 
     [UIView commitAnimations];
}
 
-( void )viewWillAppear:( BOOL )animated
{
    [ super viewWillAppear:animated];
    [ self hideTabbar: self .tabbarController];
}
 
-( void )viewWillDisAppear:( BOOL )animated
{
    [ super viewWillDisAppear:animated];
    [ self showTabbar: self .tabbarController];
}

以上代码参考了 http://stackoverflow.com/questions/5272290/how-to-hide-uitabbarcontroller


你可能感兴趣的:(IOS)