选择和突出显示时的 UIButton 标题颜色

Posted

技术标签:

【中文标题】选择和突出显示时的 UIButton 标题颜色【英文标题】:UIButton titleColor upon selection and highlight 【发布时间】:2013-07-24 18:57:07 【问题描述】:

我正在尝试将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];

但是,当使用[senderButton setSelected:YES]action: 方法中选择按钮时,它会将titleColor 设置为normalColor,而不是应该是superDuperSpecialColor,因为它既突出显示又被选中。

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

我是否必须为UIControlEventTouchCancelUIControlEventTouchUpInsideUIControlEventTouchUpOutside 添加目标,以便在高亮结束后调用setSelected: - 或者- 将UIControlStateNormaltitleColor 更改为superDuperSpecialColor按钮得到触摸?

顺便说一句,我希望像这样设置titleColor

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

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

【问题讨论】:

如果它开始时颜色正常,并且选择的设置也使其正常,你确定颜色发生了什么吗? @MarcusAdams 将其设置为选中将其设置为superDuperSpecialColor,但它仅显示按钮后的颜色未突出显示,因为按钮在按下时变为selected,即与按钮突出显示时相同。 【参考方案1】:

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

如果你有最新的 XCode,你可能想在 iOS 7 上尝试一下,看看他们是否修复了这个问题,否则将其报告为错误。

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

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

【讨论】:

这就是我最终实现的,谢谢。我也刚刚在 iOS 7 上对其进行了测试,结果似乎相同。我猜是 iOS 出了问题,在这种情况下,而不是我的大脑!【参考方案2】:

对于选中状态和高亮状态,还需要设置标题,而只有高亮状态的标题取自正常状态。所以,不要忘记添加额外的行:

[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];

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

我用的是[[UIButton alloc] initWithFrame:],所以没有任何类型。 另外,您确定您使用的是UIControlEventTouchDown,然后在着陆时调用的方法中将UIButtonselected 属性设置为YES 我的代码,我用框架初始化按钮,用故事板中创建的按钮进行测试,一切正常。 [按钮 setTitleColor:[UIColor grayColor] forState:UIControlStateNormal ]; [按钮 setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted ]; [按钮 setTitleColor:[UIColor greenColor] forState:UIControlStateSelected ]; [按钮 addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchDown]; // [按钮 setSelected:YES]; -(void)action:(id)sender NSLog(@"sender"); [按钮设置选择:是]; 嗯,这正是我所拥有的,但是当[sender setSelected:YES](我假设这只是您在评论中的复制错误)被调用时,我的按钮恢复为UIControlStateNormal 颜色.

以上是关于选择和突出显示时的 UIButton 标题颜色的主要内容,如果未能解决你的问题,请参考以下文章

Objective C - UIButton 保持突出显示/选中,背景颜色和字体颜色在突出显示/选中时发生变化

突出显示/选择时的 UITableViewCell 背景颜色

UIButton 背景颜色与突出显示的文本重叠

在 Swift (tvOS) 中,如何更改 UIButton 的突出显示和焦点颜色?

突出显示时更改 UIButton 的背景颜色

突出显示/选定状态问题的 UIButton 背景颜色