选择并突出显示UIButton titleColor

时间:2013-07-24 18:57:07

标签: ios objective-c uibutton uicontrolstate

我正在尝试将UIButton的{​​{1}}设置为某种颜色,当它被选中时以及突出显示时,我需要设置按钮在用户选择时触及titleColor

我已经这样设置了:

UIButton

但是当使用[button setTitleColor:normalColor forState:UIControlStateNormal]; [button setTitleColor:superDuperSpecialColor forState:UIControlStateHighlighted]; [button setTitleColor:superDuperSpecialColor forState:UIControlStateSelected]; [button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchDown]; action:方法中选中按钮时,它会将[senderButton setSelected:YES]设置为titleColor,而不是normalColor,它应该是superDuperSpecialColor是的,因为它都被突出显示并被选中。

注释setSelected:调用会阻止按钮变为并保持选中状态,并且注释掉突出显示的状态颜色似乎没有任何效果。

我是否必须为UIControlEventTouchCancelUIControlEventTouchUpInsideUIControlEventTouchUpOutside添加目标,以便在突出显示结束后调用setSelected: - 或者更改titleColor当按钮触摸时UIControlStateNormalsuperDuperSpecialColor

在旁注中,我本来希望设置titleColor,如此:

[button setTitleColor:superDuperSpecialColor 
             forState:(UIControlStateHighlighted | UIControlStateSelected)];

但这似乎不起作用。这是为什么? Objective-C是否检查状态等效性?

3 个答案:

答案 0 :(得分:4)

我验证了你的结果,这似乎是iOS中的一个错误。它在模拟器和设备上都失败了(iOS 6.1)。似乎所选和突出显示的状态都是YES,则所选设置应覆盖突出显示的设置。它主要以这种方式实现。按钮的文本值就像这样,但颜色似乎错了(默认为正常)。

如果您拥有最新的XCode,看看他们是否修复了此问题,您可能需要针对iOS 7进行尝试,否则将其报告为错误。

由于selected不是UIButton的常用状态,因此可能未与其他状态组合进行适当测试。

作为一种变通方法,在action方法中,您可以将正常状态的颜色设置为superDuperSpecialColor,并为修饰事件添加另一个操作,以将正常颜色设置为正常颜色。由于按下按钮时的状态实际上不应该是正常的,如果将来修复它,这不会破坏任何东西。

答案 1 :(得分:1)

对于选定状态和突出显示状态,还必须设置标题,而仅突出显示的状态标题取自正常状态。所以,不要忘记添加额外的行:

[button setTitleColor:UIColor.blackColor forState:UIControlStateSelected];
[button setTitleColor:[UIColor.blackColor colorWithAlphaComponent:0.5f]
                 forState:UIControlStateSelected | UIControlStateHighlighted];

[button setTitle:@"Title" forState:UIControlStateSelected];
[button setTitle:@"Title" forState:UIControlStateSelected | UIControlStateHighlighted];

下面的Сode工作正常,没有为突出显示状态明确设置标题:

[button setTitleColor:UIColor.greyColor forState:UIControlStateNormal];
[button setTitleColor:[UIColor.greyColor colorWithAlphaComponent:0.5f]
             forState:UIControlStateHighlighted];

[button setTitle:@"Title" forState:UIControlStateNormal];

答案 2 :(得分:0)

我认为您需要在创建时检查UIButton类型。我有这样的代码,工作正常。

但是将状态两个状态设置为一行并不适合我。

[button setTitleColor:superDuperSpecialColor 
             forState:(UIControlStateHighlighted | UIControlStateSelected)];