选择和突出显示时的 UIButton 标题颜色
Posted
技术标签:
【中文标题】选择和突出显示时的 UIButton 标题颜色【英文标题】:UIButton titleColor upon selection and highlight 【发布时间】:2013-07-24 18:57:07 【问题描述】:我正在尝试将UIButton
的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];
但是,当使用[senderButton setSelected:YES]
在action:
方法中选择按钮时,它会将titleColor
设置为normalColor
,而不是应该是superDuperSpecialColor
,因为它既突出显示又被选中。
注释掉setSelected:
调用会阻止按钮变为并保持选中状态,注释掉突出显示的状态颜色似乎没有任何效果。
我是否必须为UIControlEventTouchCancel
、UIControlEventTouchUpInside
和UIControlEventTouchUpOutside
添加目标,以便在高亮结束后调用setSelected:
- 或者- 将UIControlStateNormal
的titleColor
更改为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
,然后在着陆时调用的方法中将UIButton
的selected
属性设置为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 背景颜色