Как скрыть навигационную панель, не теряя при этом слайдов
У меня есть 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;