认识到点击导航栏标题

当用户点击导航栏中标题时,是否有人可以帮助我识别点按?

我想认识到这个水龙头,然后animationtableHeaderView出现。 可能滑动TableView下来。

这个想法是,用户可以select一个快速的选项(从tableViewHeader)来重新填充TableView。

但是我不能认出任何水龙头。

我正在使用Swift。

谢谢。

UINavigationBar不公开其内部层次结构。 没有支持的方式来获得显示标题的UILabel的引用。

你可以在视图层次结构中“手动”(通过search它的subviews ),但是在未来的iOS版本中可能会停止工作,因为视图层次结构是私有的。

一个解决方法是创build一个UILabel并将其设置为您的视图控制器的navigationItem.titleView 。 这取决于默认标签的风格,这可能会在不同版本的iOS中改变。

也就是说,设置起来非常简单:

 override func didMove(toParentViewController parent: UIViewController?) { super.didMove(toParentViewController: parent) if parent != nil && self.navigationItem.titleView == nil { initNavigationItemTitleView() } } private func initNavigationItemTitleView() { let titleView = UILabel() titleView.text = "Hello World" titleView.font = UIFont(name: "HelveticaNeue-Medium", size: 17) let width = titleView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)).width titleView.frame = CGRect(origin:CGPoint.zero, size:CGSize(width: width, height: 500)) self.navigationItem.titleView = titleView let recognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.titleWasTapped)) titleView.userInteractionEnabled = true titleView.addGestureRecognizer(recognizer) } @objc private func titleWasTapped() { NSLog("Hello, titleWasTapped!") } 

我将标签的大小设置为其自然宽度(使用sizeThatFits: ,但我将其高度设置为500.导航栏将保持宽度,但会将高度缩小到酒吧自己的高度。 这可以最大限度地挖掘(因为标签的自然高度可能只有22点,但酒吧是44点高)。

这是一个解决scheme,虽然不是超级优雅。 在故事板中,只需在标题上放置一个常规的UIButton,并将其附加到ViewController中的IBAction。 您可能需要为每个视图执行此操作。

有一个更简单,更优雅的解决scheme,使用手势识别器(至less在iOS 9及以上)。

 UITapGestureRecognizer * titleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(titleTapped)]; [self.navigationItem.titleView addGestureRecognizer:titleTapRecognizer]; 

然后添加标题tapper方法:

 -(void) titleTapped { // Called when title is tapped } 

一个简单的方法可能只是创build轻击手势识别器并将其附加到您的导航栏元素。

 // on viewDidLoad let tapGestureRecognizer = UITapGestureRecognizer(target:self, action: #selector(YourViewController.somethingWasTapped(_:))) self.navigationController?.navigationBar.addGestureRecognizer(tapGestureRecognizer) func somethingWasTapped(_ sth: AnyObject){ print("Hey there") } 

布鲁诺的回答是90%。 但是,我注意到的一件事是,导航控制器的UIBarButtonItemfunction在其他视图控制器中停止工作,一旦这个手势识别器被添加到其中。 为了解决这个问题,我只是在视图准备消失的时候从导航控制器中移除手势:

 var tapGestureRecognizer : UITapGestureRecognizer! override func viewWillAppear(_ animated: Bool) { tapGestureRecognizer = UITapGestureRecognizer(target:self, action: #selector(self.navBarTapped(_:))) self.navigationController?.navigationBar.addGestureRecognizer(tapGestureRecognizer) } override func viewWillDisappear(_ animated: Bool) { self.navigationController?.navigationBar.removeGestureRecognizer(tapGestureRecognizer) } func navBarTapped(_ theObject: AnyObject){ print("Hey there") }