我正在尝试创建一个按钮,只需触摸它就可以从normal
状态切换到selected
状态,反之亦然。但是,我没有设法让它发挥作用。这是我的代码:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *button = [UIButton new];
[button setImage:[UIImage imageNamed:@"touch_normal.png"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"touch_selected.png"] forState:UIControlStateSelected];
button.frame = CGRectMake(138.5, 208.5, 63, 63);
[button addTarget:self action:@selector(touch:) forControlEvents:UIControlEventTouchDown];
button.adjustsImageWhenHighlighted = NO;
[self.view addSubview:button];
}
- (void)touch:(id)sender
{
NSLog(@"Touch");
UIButton *button = sender;
if (button.selected)
button.selected = NO;
else
button.selected = YES;
}
@end
当我点按并按住时,会按预期触发touch
方法。但是,在我松开手指后,按钮的图像才会变为touch_selected.png
。知道可能是什么问题吗?
编辑:我知道UIControlStateHighlighted
是什么,而不是我正在寻找的东西,因为我希望我的按钮在我触摸后更改为selected
状态(但是我仍然用手指按住它),并且在我从屏幕上移开手指后它应该保持在selected
状态。
答案 0 :(得分:4)
您可能想要更改突出显示状态的图像。
您不需要在touch:
方法中执行任何操作。
只需更改一行:
[button setImage:[UIImage imageNamed:@"touch_selected.png"] forState:UIControlStateSelected];
有:
[button setImage:[UIImage imageNamed:@"touch_selected.png"] forState:UIControlStateHighlighted];
然后触摸按钮时图像应该会改变。
编辑:
要在触摸释放后让按钮保留图像,您基本上希望每次在按钮上释放触摸时反转所选状态。 我建议在按钮上添加一个目标:
[myButton addTarget:self action:@selector(buttonPushed) forControlEvent:UIControlEventTouchUpInside];
然后在该方法中,反转所选状态:
- (void)buttonPushed
{
[myButton setSelected:!myButton.selected];
}
应该有希望做到这一点!
答案 1 :(得分:2)
对于您要实现的目标,您应该使用:UIControlStateHighlighted
而不是UIControlStateSelected
选择是用户完成与其交互的时间,而突出显示的是当用户当前正在与之交互时。我认为你错误地解释了Ui控制状态流程。
修改强> 你似乎对这里玩的基础逻辑感到困惑。让我试着解释一下。
有3种状态:
你做了什么告诉你的控制使用状态A和C的特定图像,然后告诉它不要像在B状态下那样做出反应。然后你告诉它,而在状态B过渡到状态C.
这与按钮内的基础逻辑完全冲突。你不能这样做。
您需要为状态A和B指定图像,如果需要在此之后选择它,则需要在松开手指后进行操作。释放手指后,内部逻辑将切换其状态,因为它不再处于其所处状态,并且需要移除突出显示的状态。它忽略了你已将其设置为选中的事实。
如果这不适合你,你需要创建自己的按钮
答案 2 :(得分:0)
因为你要求这样做。选择按钮时,您正在更改图像。如果您想在用户触摸时更改图片,然后为UIControlStateHighlighted
设置图片,则会在button
处于highlighted
状态时更改图片。
答案 3 :(得分:0)
UIControlStateSelected
并不代表您认为的含义。轻触时选择控件。当您点击并按住控件,然后拖离该控件时,它不会被选中。您正在寻找UIControlStateHighlighted
。自己设置selected
属性也是不必要的。 UIButton
会照顾到这一点。
答案 4 :(得分:0)
该按钮还具有highlighted
状态,(视觉上)覆盖selected
状态。突出显示的状态在内部维护以显示触摸。