UIBarButtonItem 已禁用,但颜色正常

UIBarButtonItem is disabled, but has normal color

我遇到了 UIBarButtonItem 的问题。我使用外观代理为状态 NormalDisabled 设置颜色,我在 UIViewControllerviewDidLoad 方法中执行此操作。然而,按钮获得 Normal 颜色,即使它被禁用(并且它肯定被禁用,因为 IBAction 方法没有被调用)。

这个问题和这个问题类似text color of disabled uibarbuttonitem is always the color of the normal state,但是,这里发布的解决方案对我不起作用。

我的应用程序适用于 iOS 8.2,我使用的是 Xcode 6.2

有什么想法吗?

编辑: 我不确定这是否有助于找到解决方案,但是当我使用 initWithImage: 而不是 initWithTitle: 创建我的按钮时,一切似乎都运行良好。这可能是 Apple 的错误吗?

检查以下code

- (void)viewDidLoad {
    [super viewDidLoad];

    UIBarButtonItem * btnTemp = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(btnDone_Click:)];
    [btnTemp setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor lightGrayColor], NSFontAttributeName:[UIFont boldSystemFontOfSize:16.0f]} forState:UIControlStateNormal];

    [btnTemp setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor blueColor], NSFontAttributeName:[UIFont systemFontOfSize:16.0f]} forState:UIControlStateDisabled];

    [self.navigationItem setRightBarButtonItem:btnTemp];

}

- (void)btnDone_Click : (id)sender {

    UIBarButtonItem * button = (UIBarButtonItem *)sender;
    [button setEnabled:FALSE];
    [self performSelector:@selector(enableButton:) withObject:sender afterDelay:2.0f];


}

- (void)enableButton : (id)sender {
    UIBarButtonItem * button = (UIBarButtonItem *)sender;
    [button setEnabled:TRUE];
}

所以我终于设法让它正常工作,问题是我设置了两次 UIBarButtonItems 的颜色,一次使用 [navBar setTintColor:] 一次使用外观代理。只保留外观代理即可解决问题。

Swift 4

如果有人在 swift 中寻找如何更改 barbuttonitem 禁用状态的外观。给你。

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

您可能已经为 .Normal 状态设置了条形按钮项目标题文本属性,并且还需要为 .Disabled 状态设置它。

有两种方法可以解决此问题,一种是在栏按钮项目实例上设置标题文本属性,另一种是使用外观代理。

单个实例:

saveButton.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.grayColor()], forState: .Disabled)

外观代理:

UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([MyNavigationController.self]).setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.grayColor()], forState: .Disabled)

这也是我的问题,当 运行 在 iOS 版本 10.* 上时。设置按钮的前景色为我解决了这个问题。

self.saveButton.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.gray], for: UIControlState.disabled)

这更新了 Swift 4.0 的答案:

barButtonItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.gray], for: UIControlState.disabled)

这显示了针对白色 barTintColor 的禁用橙色的说明性示例:

barTintColor = .white    
cancelButton.isEnabled = false
cancelButton.setTitleTextAttributes(
    [NSAttributedStringKey.foregroundColor: UIColor.orange], 
    for: UIControlState.disabled)