Как скрыть навигационную панель, не теряя при этом слайдов

У меня есть UITableView, и у него есть панель навигации (полученная от UINavigationViewController), она способна вернуться назад, с помощью пальца.

Я попытался скрыть навигационную панель, но сохранил способность слайд-назад, код:

- (void)viewWillAppear:(BOOL)animated {
    [[self navigationController] setNavigationBarHidden:YES animated:YES];
}

Это успешно спрятало навигационную панель, однако я больше не могу вернуться на последний экран.

Есть ли способ скрыть навигационную панель, но сохранить способность к откату?

Ответ 1

Найдено решение:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // hide nav bar
    [[self navigationController] setNavigationBarHidden:YES animated:YES];

    // enable slide-back
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.enabled = YES;
        self.navigationController.interactivePopGestureRecognizer.delegate = self;
    }
}


- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    return YES;
}

И в файле .h, совместим с UIGestureRecognizerDelegate

Ответ 2

Протестировано с Swift 2 решением @gabbler, если вы используете

self.navigationController?.navigationBar.hidden = true

Swift 3.0

self.navigationController?.navigationBar.isHidden = true

вместо

self.navigationController?.navigationBarHidden = true

жестом салфетки назад работает как шарм!

Ответ 3

Используйте

self.navigationController.navigationBar.hidden = YES;

или добавьте эту строку в viewWillAppear:

self.navigationController.interactivePopGestureRecognizer.delegate = self;

Кажется, что взаимодействие неэффективно, добавив эту строку и сделайте контроллер представления совместимым с протоколом UIGestureRecognizerDelegate, чтобы он работал.

Ответ 4

Обязательно включите:

self.navigationController.navigationBar.hidden = YES;

и

self.navigationController.interactivePopGestureRecognizer.delegate = self;

и

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.enabled = YES;
    }

Он должен выглядеть следующим образом:

- (void)viewWillAppear:(BOOL)animated {

    self.navigationController.navigationBar.hidden = YES;
    self.navigationController.interactivePopGestureRecognizer.delegate = self;
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
            self.navigationController.interactivePopGestureRecognizer.enabled = YES;
        }
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    return YES;
}

Ответ 5

для Xamarin Forms я была Борьба с этим, так что сначала не NavigationRenderer вы получите NavigationController null вместо использования PageRenderer:

[assembly: Xamarin.Forms.ExportRenderer(typeof(ContentPage), typeof(ContentPageRenderer))]
namespace sample
{
    class ContentPageRenderer : PageRenderer
    {
        public override void ViewWillAppear(bool animated)
        {
            base.ViewDidAppear(animated);

            var navctrl = this.ViewController.NavigationController;
            navctrl.InteractivePopGestureRecognizer.Delegate = new UIGestureRecognizerDelegate();
            navctrl.InteractivePopGestureRecognizer.Enabled = true;

        }
    }
}

Ответ 6

Если скрытие навигационной панели не помогло, попробуйте изменить прямоугольник панели навигации и увидеть?

navBarBgFrame.origin.y = - navBarBgFrame.size.height;