【问题标题】:How to set a UIButton as both Selected and Disabled如何将 UIButton 设置为 Selected 和 Disabled
【发布时间】:2015-03-12 03:27:12
【问题描述】:

尝试同时切换 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 是什么意思?

【问题讨论】:

  • 尝试将 UIControlStateSelected 替换为 (UIControlStateHighlighted|UIControlStateSelected)
  • 添加 UIControlStateHighlighted 没有变化
  • 谢谢 Josh ...虽然您的解决方案并不完全正确,但它让我想到了正确的道路。我添加了第三个 setImage: forState:,为 (UIControlStateDisabled | UIControlStateSelected) 设置 GREY_IMAGE。

标签: ios objective-c uibutton uicontrol uicontrolstate


【解决方案1】:

对于 Swift 3:

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

【讨论】:

    【解决方案2】:

    需要添加第三个状态声明

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        对于斯威夫特:

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

        【讨论】:

          【解决方案5】:
          [button setImage:[UIImage imageNamed:@"buttonImage.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
          

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-02-27
                • 2013-06-28
                • 2019-01-17
                • 1970-01-01
                • 2020-08-26
                • 2021-12-02
                • 2022-01-14
                • 1970-01-01
                相关资源
                最近更新 更多