在导航控制器中放置后退按钮

Posted

技术标签:

【中文标题】在导航控制器中放置后退按钮【英文标题】:Placement of backbutton in navigation controller 【发布时间】:2015-12-12 15:29:44 【问题描述】:

我正在使用导航控制器,我想用自定义替换默认的后退按钮和文本。这是我的工作:

    navigationItem.backBarButtonItem = UIBarButtonItem(title: "back", style: UIBarButtonItemStyle.Plain, target: nil, action: nil)
    navigationController?.navigationBar.backIndicatorImage = UIImage(named: "BackCarretIcon")
    navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "BackCarretIcon")

这是在离开根视图控制器之前为 segue 做准备的。

当下一个视图控制器出现时,图像似乎在正确的位置,但是当推送动画完成时,后退按钮图像向下移动了一点。查看目标视图控制器的图像:

所以“BackCarretIcon”和“back”标签不是垂直居中对齐的。怎么会??以及如何解决这个问题。

目标视图控制器的视图控制器生命周期方法中没有使用导航控制器或导航项的代码。

编辑

我在目标视图控制器的viewWillLayoutSubviews 中放置了一个断点。在目标视图控制器出现在屏幕上之前,它会中断两次。当我在第二次休息后继续执行时,目标视图控制器被推到屏幕上(后括号在正确的位置)。当它被完全推到屏幕上时,后卡雷特向下跳了几个点,到了错误的位置,viewWillLayoutSubviews 再次中断。

我无法打破,在后面的carret定位正确的地方......

【问题讨论】:

【参考方案1】:

试试这个:

navigationController?.navigationItem.backBarButtonItem?.setTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: -2), forBarMetrics: UIBarMetrics.Default)

【讨论】:

没有任何区别...我也在vertical 上尝试了更高的值。并尝试将它放在为 segue 做准备和目标视图控制器 viewDidLoad 中。【参考方案2】:

后退按钮是导航视图控制器的 VC 堆栈中倒数第二个 VC 的属性。

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"BackBack" style:UIBarButtonItemStylePlain target:nil action:nil];

将它放在导航 VC 中的子 VC 中,然后将另一个 VC 推到它上面。返回按钮将显示“BackBack”。因此,正确的方法是为每个子 VC 执行此操作。在这里用户会知道最后一个 VC 是关于“BackBack”的。但尽量不要这样做。通知用户后退按钮会将他们带到哪里。破解返回按钮的工作方式可能不是最好的方法,并且可能会导致一些问题。

希望这会有所帮助。

【讨论】:

以上是关于在导航控制器中放置后退按钮的主要内容,如果未能解决你的问题,请参考以下文章

在导航控制器中设置后退按钮的操作

swift:在导航栏中设置后退按钮图像

在导航栏中的默认“后退”按钮附近添加按钮

如何在没有导航控制器的情况下获取导航栏后退按钮

为啥后退按钮不隐藏在导航控制器中?

导航视图控制器不显示后退按钮