UIBarButtonItem 已禁用,但颜色正常
UIBarButtonItem is disabled, but has normal color
我遇到了 UIBarButtonItem
的问题。我使用外观代理为状态 Normal
和 Disabled
设置颜色,我在 UIViewController
的 viewDidLoad
方法中执行此操作。然而,按钮获得 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)
我遇到了 UIBarButtonItem
的问题。我使用外观代理为状态 Normal
和 Disabled
设置颜色,我在 UIViewController
的 viewDidLoad
方法中执行此操作。然而,按钮获得 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)