2014-10-13 2 views
16

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

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

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

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

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

ответ

17

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

- (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

+1

Он работает нормально! Вместо установки ** setNavigationBarHidden: YES **, в Embed In> Navigation Controller затем выберите _UINavigationController_ и снимите флажок ** Показывает панель навигации **. Отметив это, можно удалить скрытый код навигационной панели. –

+0

Это не работает при преобразовании в swift – user7097242

6

Использование

self.navigationController.navigationBar.hidden = YES; 

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

self.navigationController.interactivePopGestureRecognizer.delegate = self; 

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

3

Убедитесь, что включают в себя:

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; 
} 
+0

Пробовал это, не работает, но спасибо. –

+0

@ ZinanXing, см. Мои правки. – WMios

+0

Спасибо за редактирование, он присваивает делегат самому себе, но не реализует метод gestureRecognizerShouldBegin. Я добавил решение, которое работает для меня. Спасибо за ваши усилия, я ценю это. –

0

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

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

33

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

self.navigationController?.navigationBar.hidden = true 

Swift 3,0

self.navigationController?.navigationBar.isHidden = true 

вместо

self.navigationController?.navigationBarHidden = true 

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

+0

Для некоторых удивительно худших и красивых причин это действительно работает. Может это ошибка в UIKit? – Entalpi

+0

Это также работает в объективе-c! Кто знал. – iosjillian

+2

Обратите внимание, что анимация этого будет ** system-smooth ** в 'viewWillAppear:' и 'viewWillDisappear:', чтобы отключить 'UINavigationBar' в определенном' UIViewController' внутри 'UINavigationController', может быть действительно хорошим вызовом, особенно когда Выполнение 'viewWillDisappear:'. В этом конкретном случае мы используем 'setNavigationBarHidden: animated:', но это также отключает 'interactivePopGestureRecognizer'. В моем конкретном случае я не делаю то, что говорит этот ответ, потому что трудно и довольно сложно использовать это свойство. –

1

для Xamarin форм я была борьба с этим, так первым не NavigationRenderer вы получите NavigationController нуля вместо этого использовать 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; 

     } 
    } 
} 
Смежные вопросы