改变UIButton背景颜色

7

我正在以编程方式创建按钮。 我想在手指弹起时改变按钮的背景颜色,再次按下时它必须恢复到平常的颜色。

nine = [UIButton buttonWithType:UIButtonTypeCustom];
[nine setFrame:CGRectMake(15, 105, 65, 40)];
[nine setTitle:@"9" forState:UIControlStateNormal];
[nine setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[nine setBackgroundColor:[UIColor cyanColor]];
[nine addTarget:self action:@selector(clickDigit:) forControlEvents:UIControlEventTouchUpInside];
[nine addTarget:self action:@selector(changeButtonBackGroundColor:) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:nine];

// 更改背景颜色

-(void)changeButtonBackGroundColor:(id) sender
{
    [nine setBackgroundColor:[UIColor redColor]];
}

这里创建了changeBackgroundColor方法来改变该按钮的颜色。它能够改变颜色。


“Touch Up” 相当于抬起手指。 - dasdom
1
那么......确切的问题是什么?您是否为已注册的操作编写了方法?如果是,可以添加那些代码吗? - DBD
请查看此帖子 https://somethingaboutios.wordpress.com/2016/02/09/uibutton-backgroundcolor-for-uicontrolstateselected/ - Gabriel.Massana
2个回答

14

不知道这是否与你的问题有关,但是:

这个
[nine setBackgroundColor:[UIColor redColor]];

应该是

[sender setBackgroundColor:[UIColor redColor]];

编辑: 更改此内容

[nine addTarget:self action:@selector(changeButtonBackGroundColor:) forControlEvents:UIControlEventTouchUpInside];

为了

[nine addTarget:self action:@selector(changeButtonBackGroundColor:) forControlEvents:UIControlEventTouchDown];
[nine addTarget:self action:@selector(resetButtonBackGroundColor:) forControlEvents:UIControlEventTouchUpInside];
[nine addTarget:self action:@selector(resetButtonBackGroundColor:) forControlEvents:UIControlEventTouchUpOutside];
[nine addTarget:self action:@selector(resetButtonBackGroundColor:) forControlEvents:UIControlEventTouchCancel];

并添加以下方法:

- (void)resetButtonBackGroundColor: (UIButton*)sender {
    [sender setBackgroundColor:[UIColor cyanColor]];
}

这个方法会改变颜色,但是在抬起手指后它没有恢复到青色。 - Karthikeya
你还需要为 UIControlEventTouchUpOutside 重置颜色,否则如果你将手指从按钮上拖出去,颜色不会重置。 - ansible
@dasdom 请编辑您的(很棒的答案)并添加 [self addTarget:self action:@selector(resetButtonBackGroundColor:) forControlEvents:UIControlEventTouchCancel]; - Colas

3

我认为您有两个选项...

第一:

您可以将 [nine setBackgroundColor:[UIColor redColor]]; 放在 "clickDigit" 内(并按照dasdom所说的重命名为sender,并更改为(UIButton*)sender)。

更改:

[nine addTarget:self action:@selector(changeButtonBackGroundColor:) forControlEvents:UIControlEventTouchUpInside];

to

[nine addTarget:self action:@selector(changeButtonBackGroundColor:) forControlEvents:UIControlEventTouchUpOutside];

以及方法“changeButtonBackGroundColor”

[sender setBackgroundColor:[UIColor cyanColor]];

第二

创建通用的UIControlEvents

[nine addTarget:self action:@selector(changeButtonBackGroundColor:) forControlEvents:UIControlEventAllEvents];

-(void)changeButtonBackGroundColor:(UIButton*) sender{
if ([sender.backgroundColor isEqual:[UIColor redColor]]){
    [sender setBackgroundColor:[UIColor cyanColor]];
}else{
    [sender setBackgroundColor:[UIColor redColor]];        
}}

我没有尝试过这段代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接