如何隐藏 UINavigationBar 但仍然向左滑动以自动返回手势?

Posted

技术标签:

【中文标题】如何隐藏 UINavigationBar 但仍然向左滑动以自动返回手势?【英文标题】:How to hide the UINavigationBar but still have the swipe left to go back gesture automatically? 【发布时间】:2015-03-22 07:57:18 【问题描述】:

我使用的是笔尖,而不是情节提要。无论如何,我正在从一个视图控制器推送到下一个:

[self.navigationController pushViewController:vc animated:YES];

但在下一个视图控制器“vc”上,我希望隐藏导航栏。但是,我仍然希望能够向左滑动以转到上一个屏幕,以及能够放置一个后退按钮来让用户返回。

但是,当我在下一个视图控制器中执行 [self.navigationController setNavigationBarHidden:YES animated:animated]; 时,这会隐藏导航栏,但您不能再滑动导航回来。

我怎样才能拥有这种向后滑动的功能,并将后退按钮放在屏幕上(只是没有导航栏?)

我正在尝试模仿 Yahoo News Digest 的行为 - 请注意,它有导航按钮,然后滑动返回,但没有导航栏。此外,当您向下滚动时,后退按钮会消失。

我尝试过让导航栏变成半透明,但随后栏会阻止触摸,因此用户无法点击栏下方的内容。有任何想法吗?谢谢!

【问题讨论】:

HorseT 的工作解决方案:***.com/questions/24710258/… 【参考方案1】:

斯威夫特

您可以使用此方法隐藏导航栏:

self.navigationController?.navigationBar.isHidden = true
// or
self.navigationController?.setNavigationBarHidden(true, animated: true)

启用 interactivePopGestureRecognizer documentation

self.navigationController?.interactivePopGestureRecognizer?.delegate = self as! UIGestureRecognizerDelegate

// Enable gesture to pop the top view controller off the navigation stack
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true

// Make an extension for your View Controller
extension MyViewController: UIGestureRecognizerDelegate 

添加 EdgePanGestureRecognizer 以识别左滑然后返回:

// in viewDidLoad
let edgePan = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(leftEdgeSwipe))
edgePan.edges = .left

view.addGestureRecognizer(edgePan)

// Method to go back
@objc func leftEdgeSwipe(_ recognizer: UIScreenEdgePanGestureRecognizer) 
   if recognizer.state == .recognized 
      self.navigationController?.popViewController(animated: true)
   

【讨论】:

【参考方案2】:

你可以做到这很简单,只需隐藏你的导航栏

[self.navigationController setNavigationBarHidden:YES animated:animated];

并添加滑动手势以导航回上一视图

- (void)viewDidLoad

   [super viewDidLoad];

 //Add Swipe Gesture to navigate back to view
UISwipeGestureRecognizer *backtoview = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeHandler)];
[self.view addGestureRecognizer: backtoview];



-(void)swipeHandler
   [self.navigationController popViewControllerAnimated:YES];

如果你想要方向,你可以添加方向来滑动手势,如果你想要按钮事件,那么添加自定义按钮并将相同的方法添加到按钮操作

这对你有帮助!

【讨论】:

但这不是交互式滑动:(并且没有UIViewControllerTransitionCoordinator参与;'-( 没错,UISwipeGestureRecognizer 并不理想,因为我希望保留本机交互式滑动行为【参考方案3】:
-(void)viewWillAppear:(BOOL)animated
    [super viewWillAppear:animated];    
    self.navigationController.navigationBar.alpha = 0;

- (void)viewWillDisappear:(BOOL)animated
    [super viewWillDisappear:animated];
    self.navigationController.navigationBar.alpha = 1;

【讨论】:

以上是关于如何隐藏 UINavigationBar 但仍然向左滑动以自动返回手势?的主要内容,如果未能解决你的问题,请参考以下文章

如何隐藏 UINavigationBar

隐藏 UINavigationBar 但仍显示状态栏

UINavigationBar 在滚动/滑动隐藏后将不再显示

如何向 UINavigationBar 添加按钮

如何隐藏 UINavigationBar 和 UITabBar 动画?

如何从 UINavigationController 隐藏 UINavigationBar?