为什么在释放手指之前未触发我的UIButton的选定状态?

时间:2014-01-17 15:23:01

标签: ios cocoa-touch uibutton selected

我正在尝试创建一个按钮,只需触摸它就可以从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状态。

5 个答案:

答案 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 - 取消选择
  • B - 突出显示
  • C - 已选择

你做了什么告诉你的控制使用状态A和C的特定图像,然后告诉它不要像在B状态下那样做出反应。然后你告诉它,而在状态B过渡到状态C.

这与按钮内的基础逻辑完全冲突。你不能这样做。

您需要为状态A和B指定图像,如果需要在此之后选择它,则需要在松开手指后进行操作。释放手指后,内部逻辑将切换其状态,因为它不再处于其所处状态,并且需要移除突出显示的状态。它忽略了你已将其设置为选中的事实。

如果这不适合你,你需要创建自己的按钮

答案 2 :(得分:0)

因为你要求这样做。选择按钮时,您正在更改图像。如果您想在用户触摸时更改图片,然后为UIControlStateHighlighted设置图片,则会在button处于highlighted状态时更改图片。

答案 3 :(得分:0)

UIControlStateSelected并不代表您认为的含义。轻触时选择控件。当您点击并按住控件,然后拖离该控件时,它不会被选中。您正在寻找UIControlStateHighlighted。自己设置selected属性也是不必要的。 UIButton会照顾到这一点。

答案 4 :(得分:0)

该按钮还具有highlighted状态,(视觉上)覆盖selected状态。突出显示的状态在内部维护以显示触摸。