【问题标题】:How to hide UITabBar on a UITabBarController that I didn't subclass?如何在我没有子类化的 UITabBarController 上隐藏 UITabBar?
【发布时间】:2011-11-26 10:43:21
【问题描述】:

视觉上这就是我想要的

我有一个UITabBarController。当用户进入中间选项卡时,我想隐藏UITabBar。中间选项卡加载 B 类的视图控制器。这是流行的相机应用程序Instagram 的行为。他们的中间选项卡加载了一个全屏相机。

-------------    -------------    -------------
|     VC    |    |     VC    |    |     VC    |
|    for    |    |    for    |    |    for    |
|     A     |    |     B     |    |     C     |
|           |    |           |    |           |
|------------    |           |    |------------
{ A } B | C |    |           |    | A | B { C }
-------------    -------------    -------------

所有其他相关 StackExchange 问题的建议解决方案

我们已经有几十个关于如何在推送特定视图控制器时隐藏 UITabBar 的问题。普遍的共识是这样的:

b.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:b
                                     animated:YES];

我的问题是,我从未对 UITabBarController 进行子类化。我在 Interface Builder 中创建了它。我从不手动推送我的视图控制器,所以上述解决方案对我不起作用。

尝试失败 1

在我的中间视图控制器中,我在构造函数中打开了hidesBottomBarWhenPushed。这没有效果。

@implementation B

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.hidesBottomBarWhenPushed = YES;
    }
    return self;
}

尝试失败 2

我还尝试将我的应用委托分配为UITabBarControllerDelegate。当 UITabBarController 通知我已经点击了一个选项卡时,我只为中间视图控制器打开hidesBottomBarWhenPushed。这也未能隐藏UITabBar

#pragma mark UIApplicationDelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    [window addSubview:self.rootViewController.view];
    [window makeKeyAndVisible];
    self.rootViewController.delegate = self;
}

#pragma mark UITabBarControllerDelegate

- (void) tabBarController:(UITabBarController *)tabBarController 
didSelectViewController:(UIViewController *)viewController
{
    if ([viewController isKindOfClass:[B class]]) {
        viewController.hidesBottomBarWhenPushed = YES;
    } else {
        viewController.hidesBottomBarWhenPushed = NO;
    }
}

【问题讨论】:

  • 但是你可以继承它并让 IB 返回你的类的一个实例。

标签: iphone objective-c ios cocoa-touch


【解决方案1】:
- (void) hidetabbar:(BOOL)hiddenTabBar
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    for(UIView *view in self.uiTabBarController.view.subviews){
        if([view isKindOfClass:[UITabBar class]]) {

            if (hiddenTabBar) {
                [view setFrame:CGRectMake(view.frame.origin.x, 431, view.frame.size.width, view.frame.size.height)];
            } else {
                [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
            }
        } else {
            if (hiddenTabBar) {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 431)];
            } else {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
            }
        }
    }
    [UIView commitAnimations];  
    hiddenTabBar = !hiddenTabBar;
}

【讨论】:

  • 这段代码放在哪里?唯一可以访问 UITabBarController 对象的地方是我的 App Delegate。 App Delegate 没有您的代码尝试使用的视图属性。 /// 我有点想出如何以更清洁的方式做到这一点。我做tabBarController.tabBar.hidden = YES;,但是标签栏曾经是一个空白区域。因此,我尝试将推送视图控制器的视图的框架设置为 320 x 480,但没有任何效果。所以我读到了这个 hack:[tabBarController.view addSubview:viewController.view],这很有效。毛茸茸的。
  • 您可以使用此代码在 X 类中创建一个 tabBarController ivar。然后在 MainWindow.xib 中放置一个 uiviewcontroller 图标,将其类设置为 X,并将 ivar 链接到 UITabBarController。此代码应在标签栏下方设置动画。无论如何,这只是一种方法。
猜你喜欢
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
相关资源
最近更新 更多