在iOS中更改禁用状态下的工具栏按钮颜色

7

我需要在导航栏中显示我的应用程序图标。为此,我已将其添加为右边的栏按钮项。我不希望它可点击,我只需要图标在那里,因此我将其设置为禁用。这样做的问题是该图标显示为灰色,而不是绿色。有没有一种方法可以禁用此按钮但仍保留其原始颜色?

8个回答

7

试试这个:

let barButtonItem = UIBarButtonItem(title: "Click", style: .Done, target: self, action: #selector(didClick(_:)))
barButtonItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.blueColor()], forState: .Normal)
barButtonItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.blueColor()], forState: .Disabled)
barButtonItem.enabled = false
navigationItem.setRightBarButtonItem(barButtonItem, animated: false)

1
尝试。
[button setBackgroundImage:yourIconImage forState:UIControlStateDisabled];
[button setEnabled:NO]

1

对我来说,被接受的答案不起作用(我认为这是因为我使用了图像而不是文本)。

您可以使用自定义视图初始化UIBarButtonItem,因此为了解决问题,我对UIBarButtonItem进行了子类化,以便它将UIButton作为初始化器参数。

以下是代码。

class TintableBarButtonItem: UIBarButtonItem {

    private(set) var button: UIButton!

    override var tintColor: UIColor? {
        get { return button.tintColor }
        set { button.tintColor = newValue }
    }

    convenience init(button: UIButton) {
        self.init(customView: button)
        self.button = button
        button.imageView?.contentMode = .scaleAspectFit
        button.frame = CGRect(x: 0, y: 0, width: 34, height: 30)            
    }

}

在我的ViewController中,我这样使用它:
override func viewDidLoad() {
    super.viewDidLoad()
    let button = UIButton()
    let image = #imageLiteral(resourceName: "MyIcon").withRenderingMode(.alwaysTemplate)
    button.setImage(image, for: .normal)
    let barButton = TintableBarButtonItem(button: button)
    navigationItem.rightBarButtonItem = barButton
}

我使用以下方法获取了框架尺寸: https://dev59.com/ZWYq5IYBdhLWcg3wpiKk#45374012 你还需要在按钮本身上设置目标操作。 你可以在这里看到类似的答案: https://dev59.com/mnE85IYBdhLWcg3wZymt#2796488

1

Swift 5:

leftDrawerButton.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: .normal)
leftDrawerButton.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: .disabled)

0
myBarButtonItem.setBackgroundImage(myIconImage, forState: .Normal, barMetrics: .Default)
myBarButtonItem.setBackgroundImage(myIconImage, forState: .Disabled, barMetrics: .Default)
myBarButtonItem.enabled = false

0

针对 Swift 4.X

let barButtonItem = UIBarButtonItem(title: "Click", style: .done, target: self, action: #selector(didClick(_:)))

barButtonItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor : UIColor.blueColor()], forState: .normal)
barButtonItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor : UIColor.blueColor()], forState: .disabled)

barButtonItem.enabled = false
navigationItem.setRightBarButtonItem(barButtonItem, animated: false)

基本上,NSForegroundColorAttributeName 变成了 NSAttributedStringKey.foregroundColor,状态从大写变成小写,例如 .Disabled 变成了 .disabled 等等。

0

要在整个应用程序中设置禁用状态的颜色,您可以在AppDelegateapplication:didFinishLaunchingWithOptions:方法中执行以下操作:

let attributes: [String: Any] = [
    NSForegroundColorAttributeName: UIColor.red.withAlphaComponent(0.5)
]

UIBarButtonItem.barAppearanceWhenContained(in: UINavigationBar.self)
    .setTitleTextAttributes(attributes, for: UIControlState.disabled)

0

Swift 5:

let barButtonItem = UIBarButtonItem(title: "Click", style: .done, target: self, action: #selector(didClick(_:)))

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

barButtonItem.isEnabled = false
navigationItem.setRightBarButton(barButtonItem, animated: false)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接