【问题标题】:Cannot modify UIBarButton tintColor无法修改 UIBarButton tintColor
【发布时间】:2016-03-22 00:08:36
【问题描述】:

我的导航栏中有一个 UIBarButton,我从情节提要中为它设置了一个图像 (silhouette.png),我可以随意更改该图像的色调(颜色):

    if let num2 = Int(s, radix: 16) { //s="00ff00"
        flamingoBtn.tintColor = UIColor(netHex:num2) //this btn is an IBoutlet
     }

但是,在某些时候,我以编程方式将原始图像更改为另一个图像 (icon.png),因此在这种情况下我不需要更改色调,到目前为止一切顺利:

if let url = NSURL(string: "http://www.123di.com/CanonSGLens_132.png") {
            if let data = NSData(contentsOfURL: url) {
                var newImgThumb : UIImage=UIImage(data: data)!

                var iconBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 35, height: 35))
                iconBtn.setImage(newImgThumb, forState: UIControlState.Normal)
                iconBtn.addTarget(self, action: "goToSettings:", forControlEvents:  UIControlEvents.TouchUpInside)
                var item = UIBarButtonItem(customView: iconBtn)
                self.navigationItem.leftBarButtonItem = item
                print("CUSTOM ICON: DOWNLOADED")
            }
        }

问题来了,当我将图标图像切换到原始剪影.png时,因为我无法再修改色调,它始终保持蓝色剪影(默认颜色),而不是绿色、红色等:

        var newImgThumb : UIImage=UIImage(named: "happyface.png")!
        var replyBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 35, height: 35))
        replyBtn.setImage(newImgThumb, forState: UIControlState.Normal)
        replyBtn.addTarget(self, action: "goToSettings:", forControlEvents:  UIControlEvents.TouchUpInside)
        replyBtn.tintColor = UIColor.greenColor()
        var item = UIBarButtonItem(customView: replyBtn)
        item.tintColor = UIColor.greenColor()//UIColor(netHex:num2)
        self.navigationItem.leftBarButtonItem = item

我做错了什么,为什么之后会发生色调变化? 如果您需要更多详细信息,请告诉我。

【问题讨论】:

  • 您是否尝试过存储对按钮的引用,并在设置和呈现按钮后更改该点的色调?

标签: ios swift uibarbuttonitem tint uibaritem


【解决方案1】:

如果你用谷歌搜索如何为你的栏按钮设置自定义图像,几乎每个人都会告诉你创建一个UIButton,然后从UIButton 创建UIBarButtonItem 作为customView:。在这种情况下,您在这里做的是正确的事情。

但是,如果您通过cutomView: 创建UIBarButtonItem,则无法再更改tintColor。以下是您如何设置自定义图像并更改tintColor

    let item = UIBarButtonItem.init(image: UIImage(named: "happyface.png")!,
                style: .Plain,
                target: self,
                action: Selector("goToSettings:"))
    item.tintColor = UIColor.greenColor()
    self.navigationItem.leftBarButtonItem = item

根据你在哪里调用上面的代码,你可能需要把它放在这个结构中,让它在 UI 线程中运行并使更改可见:

dispatch_async(dispatch_get_main_queue()) {  
//code here
}

【讨论】:

  • 兄弟,你成功了。谢谢!!我只需将该代码包装在 dispatch_async(dispatch_get_main_queue()) { //code here } 中,以便代码在 UI 线程中执行并且更改可见。只需添加额外的代码行,我就会给你那个绿色勾号。 @Yuchen-Zhong
  • 嘿@Josh,很高兴知道它有帮助:) 我个人不想在此处的答案中添加队列调度,因为它与您提出的问题无关:为什么我不能改变色调。添加这将使问题/答案更加复杂,并且对遇到相同问题的其他人的帮助更少。如果您知道您在 UI 线程上并且仅在您在后台线程中时分派,则不应添加此内容。总的来说,dispatch_async 并不便宜。
  • 这是有道理的,我将它添加为可选的东西,因为有些人不知道它并开始认为代码不起作用。 (包括我,不久前)@Yuchen-Zhong
【解决方案2】:

如果有人仍在寻找解决方案。

barButtonItem.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.red], for: .normal)

通过设置标题文字属性的NSAttributedString.Key.foregroundColor,可以设置按钮的颜色。

【讨论】:

    【解决方案3】:

    如果你遵循这种方式,你可以做任何你想做的事情。

    let logoutNavBarButtonItem = UIBarButtonItem.init(
        image: imageName,
        style: .plain,
        target: self,
        action: #selector(buttonPressed))
    navigationItem.leftBarButtonItem = logoutNavBarButtonItem
    

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 2021-02-12
      • 2019-12-04
      • 2018-05-22
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多