如何将 UIButton 设置为选中和禁用

How to set a UIButton as both Selected and Disabled

尝试在 UI 按钮上切换选中和启用属性,因此创建 4 种潜在状态(选中和禁用、选中和启用、未选中和禁用、未选中和启用)。

在 viewDidLoad 中,我定义了按钮状态的图像

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.inputToolbar.contentView.leftBarButtonItem setImage:[UIImage imageNamed:BLUE_IMAGE] forState:UIControlStateNormal];
    [self.inputToolbar.contentView.leftBarButtonItem setImage:[UIImage imageNamed:GREY_IMAGE] forState:UIControlStateSelected];
}

在 viewWillAppear 中,我有条件地设置了 enabled 属性以及 属性(我们称之为 self.buttonShouldBeSelected),然后在其 [=28= 中设置 UIButton 的 selected 属性].连同 viewDidLoad

中的一些调试代码
- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // default control states
    self.inputToolbar.contentView.leftBarButtonItem.enabled = NO;

    if (self.aBoolean) {
         self.buttonShouldBeSelected = [self.aNSNumber boolValue];
    }
}

- (void)setButtonShouldBeSelected:(BOOL)buttonShouldBeSelected
{
    self.inputToolbar.contentView.leftBarButtonItem.selected = buttonShouldBeSelected;
    _buttonShouldBeSelected = buttonShouldBeSelected;
}

- (void)viewDidAppear
{
    NSLog(@"SELECTED: %u", self.inputToolbar.contentView.leftBarButtonItem.selected);
    NSLog(@"ENABLED: %u", self.inputToolbar.contentView.leftBarButtonItem.enabled);
    NSLog(@"STATE: %lu", self.inputToolbar.contentView.leftBarButtonItem.state);
}

除了一种情况,当按钮被禁用并处于选中状态时,这在所有情况下都有效。在这种情况下,UI 显示 BLUE_IMAGE 而不是所选状态的 GREY_IMAGE 并且按钮被正确禁用。

在这种情况下,日志结果为...

SELECTED: 1
ENABLED: 0
STATE: 6

我做错了什么,为什么显示 NormalState 的图像以及 UIControlState == 6 是什么意思?

[button setImage:[UIImage imageNamed:@"buttonImage.png"] forState:UIControlStateSelected | UIControlStateHighlighted];

您可以尝试将色调颜色设置为零吗?

[self.inputToolbar.contentView.leftBarButtonItem setTintColor:nil];

需要添加第三状态声明

[self.inputToolbar.contentView.leftBarButtonItem setImage:[UIImage imageNamed:GREY_IMAGE] forState:(UIControlStateDisabled | UIControlStateSelected)]

对于Swift:

inputToolbar.contentView.leftBarButtonItem.setImage(UIImage(named: GREY_IMAGE), forState: [.Disabled, .Selected])

对于 Swift 3:

inputToolbar.contentView.leftBarButtonItem.setImage(UIImage(named: GREY_IMAGE), for: [.disabled, .selected])

我遇到了同样的问题。我使用 属性 isUserInteractionEnabled 而不是 isEnabled,所以按钮可以保持之前的状态。

这就是组合状态对我在 Swift 中起作用的方式:

let state = UIControl.State.selected.union(UIControl.State.disabled)
button.setImage(image, for: state)