为啥在我松开手指之前我的 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 的选中状态没有被触发?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 UIButton 没有显示在我的子视图中? iPad 应用程序