为啥在我松开手指之前我的 UIButton 的选中状态没有被触发?

Posted

技术标签:

【中文标题】为啥在我松开手指之前我的 UIButton 的选中状态没有被触发?【英文标题】:Why is the selected state of my UIButton not triggered before I release my finger?为什么在我松开手指之前我的 UIButton 的选中状态没有被触发? 【发布时间】:2014-01-17 15:23:00 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可能想要更改突出显示状态的图像。

您不需要在 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];

这应该可以解决问题!

【讨论】:

这实际上是我现在正在做的事情。 :) (除了我在buttonPushed 方法中使用if-statement,因为它是一个学校项目,它使它更具可读性)【参考方案2】:

对于您想要实现的目标,您应该使用:UIControlStateHighlighted 而不是 UIControlStateSelected

选中是用户完成与其交互的时间,而突出显示是用户当前与其交互的时间。我认为您误解了 Ui 控制状态流。

编辑: 您似乎对这里播放的基本逻辑感到困惑。让我试着解释一下。

有3种状态:

A - 未选择 B - 突出显示 C - 已选择

您所做的是告诉您的控件对状态 A 和 C 使用特定图像,然后告诉它不要像在状态 B 中那样做出反应。然后您告诉它,在状态 B 中转换到状态 C。

这都与按钮内部的底层逻辑相冲突。你不能这样做。

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

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

【讨论】:

在我添加那行代码之前,按钮显示了一个突出显示的状态,这是我不想要的。因此,我添加了这一行来防止这种情况发生。 @timvermeulen 好的,我的其余部分仍然有效,但我将编辑并删除它 我认为你误解了我的意图。我希望我的按钮在我触摸它后更改为选定的更改(所以它应该在我仍然握住它时更改),并且在我松开手指后它应该保持在选定的状态。 @timvermeulen 是的,我知道您要做什么。你问题的最后一行说图像只有在你松开手指时才会改变。保持一切原样并将“已选择”图像控件状态更改为 UIControlStateHighlighted ,您希望按钮可以简单地从未选中变为选中。有一个高亮的中间状态。您将需要通过执行上述操作来覆盖此功能 但是在我松开手指后按钮又回到normal状态。【参考方案3】:

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

【讨论】:

但是当我触摸按钮时,touch: 方法被触发(我用NSLog 验证)这会改变我按钮的selected 属性。 但是那不是选中状态,那是高亮状态……你的设置被选中了,但是当你释放它时它会生效……如果你点击并按住它,它的高亮状态.. .【参考方案4】:

UIControlStateSelected 并不代表您认为的意思。当一个控件被点击时它被选中。当您点击并按住控件,然后将其拖离该控件时,它不会被选中。您正在寻找UIControlStateHighlighted。也不需要自己设置 selected 属性。 UIButton 会解决这个问题。

【讨论】:

【参考方案5】:

按钮还有一个highlighted 状态,它(视觉上)覆盖selected 状态。高亮状态在内部保持以显示触摸。

【讨论】:

哦,我不知道。知道我该如何解决吗? (或者我不应该?)

以上是关于为啥在我松开手指之前我的 UIButton 的选中状态没有被触发?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的平移手势只能在第二次输入后识别事件?

Swift 中的可拖动 UIButton/元素?

为啥我的 UIButton 没有显示在我的子视图中? iPad 应用程序

UIButton的状态

UIButton UIControlEventTouchUpInside 触发事件,即使在按钮框架之外拿起手指

单元格子视图上的 UIButton 问题