3

我正在尝试将 a 设置UIButtontitleColor某种颜色,当它被选中并突出显示时,但是,我需要设置当用户按下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:using 方法中选择按钮时[senderButton setSelected:YES],它会将 设置titleColornormalColor,而不是superDuperSpecialColor,它应该是,因为它既突出显示又被选中。

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

我是否必须添加目标UIControlEventTouchCancelUIControlEventTouchUpInside并且UIControlEventTouchUpOutside为了setSelected:在突出显示结束后调用 - 或 - 将 for 更改titleColorUIControlStateNormal按钮superDuperSpecialColor被触摸时?

在旁注中,我希望这样设置titleColor

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

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

4

3 回答 3

4

我验证了你的结果,这似乎是 iOS 中的一个错误。它在模拟器和设备(iOS 6.1)上都失败了。看起来如果选定和突出显示的状态都是YES,那么选定的设置应该覆盖突出显示的设置。它主要是这样实现的。按钮的文本值是这样工作的,但颜色似乎弄错了(默认为正常)。

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

由于selected不是 a 的常用状态UIButton,因此它可能没有与其他状态结合进行适当的测试。

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

于 2013-07-24T20:19:18.677 回答
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];

下面的代码可以正常工作,无需为突出显示状态明确设置标题:

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

[button setTitle:@"Title" forState:UIControlStateNormal];
于 2017-03-24T09:20:02.377 回答
0

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

但是在一行中设置两个状态对我不起作用。

[button setTitleColor:superDuperSpecialColor 
             forState:(UIControlStateHighlighted | UIControlStateSelected)];
于 2013-07-24T19:18:41.210 回答