隐藏TabBar并在按钮单击时显示NavigationController工具栏

时间:2014-06-22 16:27:26

标签: ios objective-c uinavigationcontroller uitabbarcontroller

我有以下视图层次结构:

标签栏控制器 - >导航控制器 - >自定义视图控制器

在我的自定义视图中,我希望TabBar消失并显示工具栏。与按下'选择'

中的iOS7原生照片应用程序非常相似

我尝试了不同的解决方案,但我设法得到了:

  1. TabBar隐藏,工具栏显示黑色间隙
  2. 隐藏TabBar并隐藏工具栏
  3. TabBar隐藏的工具栏显示与底部的间隙。但是,自定义视图内容到达屏幕底部(在工具栏下方和标签栏位于同一位置)
  4. 与我发现的其他解决方案的不同之处在于,我需要在点击时发生这种情况而不是推送。

    我尝试过的一些事情:

    // #1
    [self.navigationController.toolbar setHidden:!isSelecting];
    [self.tabBarController.tabBar setHidden:isSelecting];
    
    // #2
    self.hidesBottomBarWhenPushed = YES;
    
    // #3
    #1 & #2 variants @ different controller along the path
    

2 个答案:

答案 0 :(得分:6)

最终,在玩完设置后,我设法让它发挥作用。我不确定为什么它现在有用而且之前没有用,所以我很感激你的意见。

<强>故事板:

  1. 标记为已选中&#34;在推送时隐藏底栏&#34;用于自定义视图控制器
  2. 标记为已选中&#34;显示工具栏&#34;用于导航控制器
  3. <强>代码:

    在按钮上单击隐藏/取消隐藏tabBar:[self.tabBarController.tabBar setHidden:state]

    这几乎可行。按下按钮时它会隐藏/取消隐藏tabBar,但唯一的问题是切换标签时最初会隐藏tabBar。我不得不做一些额外的努力让它可见。

    设置UITabBarControllerDelegate以在切换标签时取消隐藏tabBar。我是在自定义SUSourceTabController中完成的:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.delegate = self;
    }
    
    - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:   (UIViewController *)viewController
    {
        [self.tabBar setHidden:NO];
    }
    

    我们还需要取消隐藏自定义视图控制器代码中的第一个选项卡视图。在代码中的任何其他位置使用setHidden:NO都无效。

    - (void)viewDidLoad
    {
        [super viewDidLoad];    
        [self.tabBarController.tabBar setHidden:NO];
    }
    

答案 1 :(得分:0)

question的答案中查看此类别。

的UITabBarController + HideTabbar.h

#import <UIKit/UIKit.h>

@interface UITabBarController (HideTabbar)
- (void)setHidden:(BOOL)hidden animated:(BOOL)animated;
@end

的UITabBarController + HideTabbar.m

#import "UITabBarController+HideTabbar.h"
#define kAnimationDuration .3
@implementation UITabBarController (HideTabbar)

- (void)setHidden:(BOOL)hidden animated:(BOOL)animated
{
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    float fHeight = screenRect.size.height;
    if (UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) {
        fHeight = screenRect.size.width;
    }
    if (!hidden) {
        fHeight -= self.tabBar.frame.size.height;
    }
    CGFloat animationDuration = animated ? kAnimationDuration : 0.f;
    [UIView animateWithDuration:animationDuration animations:^{
        for (UIView *view in self.view.subviews){
            if ([view isKindOfClass:[UITabBar class]]) {
                [view setFrame:CGRectMake(view.frame.origin.x, fHeight, view.frame.size.width, view.frame.size.height)];
            }
            else {
                if (hidden) {
                    [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
                }
            }
        }
    } completion:^(BOOL finished){
        if (!hidden){
            [UIView animateWithDuration:animationDuration animations:^{
                for(UIView *view in self.view.subviews) {
                    if (![view isKindOfClass:[UITabBar class]]) {
                        [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, fHeight)];
                    }
                }
            }];
        }
    }];
}

@end