添加 UIBarButtonItem 覆盖 UINavigationController 后退按钮

Posted

技术标签:

【中文标题】添加 UIBarButtonItem 覆盖 UINavigationController 后退按钮【英文标题】:Added UIBarButtonItem covers UINavigationController back button 【发布时间】:2016-11-25 13:13:58 【问题描述】:

当我的应用在 RTL 设备配置上运行时,我将 UIBarButtonItem 添加到 self.navigationItem.leftBarButtonItem,在 LTR 设备配置时添加了 self.navigationItem.rightBarButtonItem。 在这两种配置中添加的UIBarButtonItem 覆盖了默认按钮的后退按钮。

这是我的代码:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: CGFloat(150), height: CGFloat(20)))
    label.backgroundColor = UIColor.clear
    label.font = UIFont.systemFont(ofSize: 18.0)
    label.shadowColor = UIColor(white: 0.0, alpha:0.5)
    label.textAlignment = NSTextAlignment.center
    label.textColor = UIColor(hexaValue: ConsColors.albums)
    label.text = "Just text"
    label.sizeToFit()
    if UIApplication.shared.userInterfaceLayoutDirection == UIUserInterfaceLayoutDirection.rightToLeft
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: label)
    else
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: label)
    

我什至尝试过使用普通系统UIBarButtonItem。 还尝试设置UINavigationcontroller语义内容属性强制RightToLeft或LefttoRight这不起作用。

UINavigationBar.appearance().semanticContentAttribute = .forceRightToleft

我使用 Swift 3、Xcode 8.1 和 iPad Air 2,其操作系统版本为 9.3.2 有人知道怎么解决吗?

将不胜感激,谢谢。

【问题讨论】:

【参考方案1】:

在下方设置此属性

self.navigationItem.leftItemsSupplementBackButton = true

这将确保在返回按钮之后添加自定义按钮

更新:

据我了解,您的要求是在另一侧有默认的后退按钮和自定义按钮。不需要以下条件

    if UIApplication.shared.userInterfaceLayoutDirection == UIUserInterfaceLayoutDirection.rightToLeft
        self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: label)
    else
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: label)
    

替换为

self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: label)

【讨论】:

谢谢,我试过了,它现在没有覆盖后退按钮,虽然我想要实现的是一侧的后退按钮和另一侧的另一个按钮/视图,而不是两个按钮同一侧。这发生在我身上。 当我的设备配置 LTR 时,它可以工作,后退按钮在左侧,第二个按钮在右侧。虽然在配置设备时,RTL 后退按钮和第二个按钮在右侧并排。奇怪的行为。正如我所搜索的那样,没有 self.navigationItem.rightItemsSupplementBackButton :( 谢谢,你是对的,不需要if语句。它现在正在工作。【参考方案2】:

看起来通过明确设置右栏按钮项目,您正在覆盖股票后退按钮。幸运的是,有一种内置方式可以让您拥有多个左栏按钮项,而且它比您想象的还要简单。与其设置navigationItem.leftBarButtonItem,不如设置navigationItem.leftBarButtonItems!这是一个例子:

let backButton = self.navigationItem.leftBarButtonItem
let newButton = UIBarButtonItem(customView: label)
self.navigationItem.leftBarButtonItems = [backButton, newButton]

【讨论】:

谢谢,我已经尝试过了,它一直覆盖后退按钮,尽管我想要实现的是一侧的后退按钮和另一侧的另一个按钮/视图而不是同一侧的两个按钮。

以上是关于添加 UIBarButtonItem 覆盖 UINavigationController 后退按钮的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式添加UIBarButtonItem

如何以编程方式添加 UIBarButtonItem?

在 UIBarButtonItem 中添加边框

将相同的 UIBarButtonItem 添加到几个 UIViewControllers

添加 UIStackView 作为 UIBarButtonItem 的自定义视图

添加到情节提要的 UIBarButtonItem 在运行时不会出现