При использовании hidesBottomBarWhenPhed я хочу, чтобы панель вкладок появлялась снова, когда я нажимаю другой вид - PullRequest
10 голосов
/ 25 мая 2011

У меня есть контроллер навигации. Для одного из представлений я хочу скрыть нижнюю панель вкладок, чтобы получить максимально возможную площадь экрана. Для этого у меня есть:

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

Но для следующего представления, которое я помещаю в стек, я хочу, чтобы панель вкладок появлялась снова. Есть ли способ сделать это?

Ответы [ 6 ]

12 голосов
/ 10 мая 2012

Начиная с iOS5, это очень простой способ сделать это. По сути, это тот же метод, что и у Deepak, но с анимацией нет никаких артефактов - все выглядит так, как ожидалось.

При инициализации установите

self.hidesBottomBarWhenPushed = YES;

так же, как у вас выше. Когда пришло время поместить новый контроллер в стек, это так просто:

self.hidesBottomBarWhenPushed = NO;

UIViewController *controller = [[[BBListingController alloc] init] autorelease];
[self.navigationController pushViewController:controller];

self.hidesBottomBarWhenPushed = YES;

Важно сбросить значение на YES после нажатия контроллера, чтобы снова скрыть панель, когда пользователь нажимает кнопку «Назад» и вид возвращается в представление.

6 голосов
/ 15 октября 2017

Я решил эту проблему так:

Почти все мои ViewController являются потомками BaseViewController.

Итак, пример:

class BaseVC: UIViewController {
    final override var hidesBottomBarWhenPushed: Bool {
        get {
            if navigationController?.viewControllers.last == self {
                return prefersBottomBarHidden ?? super.hidesBottomBarWhenPushed
            } else {
                return false
            }
        } set {
            super.hidesBottomBarWhenPushed = newValue
        }
   }
   private(set) var prefersBottomBarHidden: Bool?
}

Просто переопределите переменную "prefersBottomBarHidden" во ViewController, где BottomBar должен быть скрыт:

override var prefersBottomBarHidden: Bool? { return true }
3 голосов
/ 22 марта 2016

Случай один : Чтобы скрыть UITabbarController в отдельном UIVIewController, например, при вызове self.performSegueWithIdentifier("Identifier", sender: self), перед этим необходимо установить флаг self.hidesBottomBarWhenPushed = true.А после self.hidesBottomBarWhenPushed = false флаг.Но мы должны понимать, что через один UIViewController UITabbarController появится вновь и, в случае необходимости использования UITabbarController с одним UIViewControler, он не даст правильного результата.

в FirstItemViewController

    @IBAction func pushToControllerAction(sender: AnyObject) {
        self.hidesBottomBarWhenPushed = true
        self.performSegueWithIdentifier("nextController", sender: self)
        self.hidesBottomBarWhenPushed = false
    }

enter image description here

Случай второй : скрыть UITabbarController в определенном UIVIewController, после чего должен быть извлечен UITabbarController, оннеобходимо, например, при вызове self.performSegueWithIdentifier("nextController", sender: self) установить self.hidesBottomBarWhenPushed = true перед методом.Alse willMoveToParentViewController(parent: UIViewController?) в методе должно быть настроено так, как показано в примере кода.

в первом UIViewController «FirstItemViewController»

 @IBAction func pushToControllerAction(sender: AnyObject) {
     self.hidesBottomBarWhenPushed = true
     self.performSegueWithIdentifier("nextController", sender: self)
 }

в следующем UIViewController «ExampleViewController»`

 override func willMoveToParentViewController(parent: UIViewController?) {
         if parent == nil {
             var viewControllers = self.navigationController!.viewControllers
             if ((viewControllers[viewControllers.count - 2]).isKindOfClass(FirstItemViewController.self)) {
                 (viewControllers[viewControllers.count - 2] as! FirstItemViewController).hidesBottomBarWhenPushed = false
             }
         }
 }

Код Swift 3:

let viewControllers = self.navigationController!.viewControllers
                if ((viewControllers[viewControllers.count - 2]) is (FirstItemViewController)) {
                    (viewControllers[viewControllers.count - 2] as! FirstItemViewController).hidesBottomBarWhenPushed = false
                }

enter image description here

Тестовый проект

2 голосов
/ 03 января 2018

Прошло много времени с тех пор, как этот вопрос был задан, но ни один из этих ответов не использует Раскадровки . Оказывается довольно просто:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "MyViewControllerIdentifier" {

        // Hide the tabbar during this segue
        hidesBottomBarWhenPushed = true

        // Restore the tabbar when it's popped in the future
        DispatchQueue.main.async { self.hidesBottomBarWhenPushed = false }

    }
}
2 голосов
/ 25 мая 2011

Можно заставить его появиться снова, но это приведет к неправильной анимации. Страница появляется слева, а нижняя панель справа. Так что это, вероятно, не то поведение, которое вы хотите. Но в том же контроллере, выполните self.hidesBottomBarWhenPushed = NO; перед тем, как вставить следующий контроллер вида.

1 голос
/ 07 февраля 2013

В корневом контроллере представления «A» (который показывает tabBar), когда приходит время показать другой контроллер представления «B», где не требуется tabBar:

self.hidesBottomBarWhenPushed = YES; // hide the tabBar when pushing B
[self.navigationController pushViewController:viewController_B animated:YES];
self.hidesBottomBarWhenPushed = NO; // for when coming Back to A

В контроллере представления B, когда приходит время показывать третий контроллер вида C (снова требуется tabBar):

self.hidesBottomBarWhenPushed = NO; // show the tabbar when pushing C
[self.navigationController pushViewController:viewController_C animated:YES];
self.hidesBottomBarWhenPushed = YES; // for when coming Back to B
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...