Swift-5.0 中的 UIBarButtonItem 颜色设置

Posted

技术标签:

【中文标题】Swift-5.0 中的 UIBarButtonItem 颜色设置【英文标题】:UIBarButtonItem color setting in Swift-5.0 【发布时间】:2019-09-16 12:50:06 【问题描述】:

我意识到我的 UIBarButtonItem(左右按钮)的颜色行为不符合预期。

如果我按住右侧的 UIBarButton(参见视频),颜色会从浅黄色变为 gray'isch 深黄色。

但是,我想要一个保持相同浅黄色的解决方案,无论选择任何按钮、按住等等。按钮颜色应始终保持相同的浅黄色。

我怎样才能做到这一点?

这是在模拟器中完成的视频: (您可以清楚地看到单击 - 按住会导致颜色变化。即使按住不放也保持浅黄色的解决方案是什么??)

代码如下:

@IBOutlet weak var btnCancel: UIBarButtonItem!
@IBOutlet weak var btnApply: UIBarButtonItem!

override func viewDidLoad() 
    super.viewDidLoad()

    btnCancel.title = "Cancel".localized
    btnApply.title = "Apply".localized
    navigationItem.title = "Filter".localized

    let attributes: [NSAttributedString.Key : Any] = [ .font: UIFont(name: "Avenir-Heavy", size: 14)!, .foregroundColor: UIColor.yellow]
    navigationItem.rightBarButtonItem?.setTitleTextAttributes(attributes, for: .normal)
    navigationItem.rightBarButtonItem?.setTitleTextAttributes(attributes, for: .selected)
    navigationItem.rightBarButtonItem?.setTitleTextAttributes(attributes, for: .highlighted)
    navigationItem.rightBarButtonItem?.setTitleTextAttributes(attributes, for: .focused)

【问题讨论】:

我认为使用标准 UIBarButtonItem 是不可能的,因为大多数应用程序中所有 UIButton 的行为都是本机和标准的。您可以选择的一种选择是设置customView 属性,而不是使用UIBarButtonItem 的title。不太清楚为什么你会想要那个 谢谢 - 我会查看 cutomView。而“为什么”是由我的设计师推动的;) 【参考方案1】:

以下是通过将普通按钮包装为 barButton 项来实现所需效果的方法。

    private let normalButton: UIButton = 
        let normalButton = UIButton()
        normalButton.frame = CGRect(x: 0, y: 0, width: 80, height: 30)
        normalButton.setTitle("Apply", for: .normal)
        normalButton.setTitleColor(.yellow, for: .normal)
        normalButton.isUserInteractionEnabled = true
        return normalButton
    ()

    private lazy var applyRightBarButtonItem: UIBarButtonItem = 
        // Wrap your button as UIBarButtonItem
        return UIBarButtonItem(customView: normalButton)
    ()

    override func viewDidLoad() 
        super.viewDidLoad()
        // Important for detecting taps
        normalButton.addTarget(self, action: #selector(normalButtonTapped), for: .touchUpInside)
        // Set your right bar button ( You can do the same for the left one)
        self.navigationItem.rightBarButtonItem = applyRightBarButtonItem

    

    @objc private func normalButtonTapped() 
        // TODO: - Handle tap
        print("Button Tapped")
    

【讨论】:

【参考方案2】:

请尝试这种方法:

// MARK:- Custom BarButton Appearance
private extension YourViewController 

    func setupBarButtonAppearance() 

        let color = UIColor.yellow
        let font = UIFont(name: "Avenir-Heavy", size: 14)!

        let customAppearance = UIBarButtonItem.appearance(whenContainedInInstancesOf: [YourViewController.self])

        customAppearance.setTitleTextAttributes([
        NSAttributedString.Key.foregroundColor : color,
        NSAttributedString.Key.font : font], for: .normal)

        customAppearance.setTitleTextAttributes([
        NSAttributedString.Key.foregroundColor : color,
        NSAttributedString.Key.font : font], for: .highlighted)
    

只需在 viewDidLoad() 中调用此方法

【讨论】:

以上是关于Swift-5.0 中的 UIBarButtonItem 颜色设置的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 5.0 中从 AppDelegate 实例化窗口失败 [重复]

惊喜!!Swift 5.0 官方文档中文版新鲜出炉

重磅!!!Swift 5.0 官方文档中文版新鲜出炉

WatchOS 6.0、Swift 5.0:无背景触觉

带有 Swift 5.0 编译器的 Xcode 10.2 - 协议继承问题

Swift 5.0 值得关注的特性:更强大的 Raw String