4

尝试切换 UIButton 上的 selected 和 enabled 属性,因此创建 4 个潜在状态(Selected & Disabled、Selected & Enabled、Unselected & Disabled、unselected & Enabled)。

在 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),然后在其设置器中设置 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 是什么意思?

4

7 回答 7

4

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

于 2018-07-12T07:39:49.347 回答
4

对于 Swift 3:

inputToolbar.contentView.leftBarButtonItem.setImage(UIImage(named: GREY_IMAGE), for: [.disabled, .selected])
于 2017-03-15T08:39:51.523 回答
3

需要添加第三状态声明

[self.inputToolbar.contentView.leftBarButtonItem setImage:[UIImage imageNamed:GREY_IMAGE] forState:(UIControlStateDisabled | UIControlStateSelected)]
于 2015-01-14T16:50:57.067 回答
1

对于斯威夫特:

inputToolbar.contentView.leftBarButtonItem.setImage(UIImage(named: GREY_IMAGE), forState: [.Disabled, .Selected])
于 2016-03-18T19:44:50.810 回答
0

您可以尝试将 tint color 设置为 nil 吗?

[self.inputToolbar.contentView.leftBarButtonItem setTintColor:nil];
于 2015-01-14T08:15:16.567 回答
0
[button setImage:[UIImage imageNamed:@"buttonImage.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
于 2015-01-14T07:40:20.983 回答
0

这就是组合状态在 Swift 中为我工作的方式:

let state = UIControl.State.selected.union(UIControl.State.disabled)
button.setImage(image, for: state)
于 2020-11-21T22:55:48.853 回答