取消正在按下的UIButton触摸事件

10

我有一个情况,用户可能正在触摸UIButton,但我需要能够取消它或使其失败。

我尝试过使用button.enabled和userInteractionEnabled,但都不能实时生效。两者都必须在触摸开始前设置。

我能否在触摸后并且在触摸期间使按钮失败?


你是想取消后台进程还是直接与按钮连接的出口? - Bartu
5个回答

11

您需要为按钮注册两个操作,一个是触摸下降,一个是触摸松开。在触摸下降时,您可以决定是否要取消;在触摸松开时,编写实际的按钮按下逻辑。

[button addTarget:self action:@selector(touchDown:) forControlEvents:UIControlEventTouchDown]; 

- (IBAction)touchDown:(id)sender
{
    UIButton *b = (UIButton*)sender;

    // Call this if you wish to cancel the event tracking
    [b cancelTrackingWithEvent:nil];
}

可参考UIControl中的-cancelTrackingWithEvent:方法的文档。


2

您可以做的一件事情是自定义按钮的按下外观以满足您的需求。使用以下代码:

- setBackgroundImage:@"NormalStateImage.png" forState: UIControlStateNormal - setBackgroundImage:@"HighlightedStateImage.png" forState: UIControlStateHighlighted

adjustsImageWhenHighlighted属性设置为NO,并将adjustsImageWhenDisabled属性设置为NO。


这是我目前的解决方法,但似乎我应该能够以某种方式取消触摸。 - daveMac
你可以取消触摸,但是你必须以不同的方式处理它们。你需要实现UIResponder的响应触摸事件功能。请查看苹果文档http://developer.apple.com/library/ios/#documentation/uikit/reference/UIResponder_Class/Reference/Reference.html和这个教程http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-detecting-touches/。 - luksfarris
类似 hitTest 这样的东西不是更简单吗? - daveMac

1

这可以适用于任何UIButton。如果您想在用户开始点击按钮的时候取消按钮的按下操作,则应执行以下步骤:

  1. 设置处理程序以检查需要取消的事件。在这种情况下,当按钮按下时。

    [yourButton addTarget: self
                   action: @selector(buttonIsDownHandler:)
         forControlEvents: UIControlEventTouchDown];
    
  2. 在处理程序中,决定是否取消按下操作

    -(IBAction) buttonIsDownHandler: (id) sender
    {
       if (needToCancelThisPress)
       {
          [yourButton cancelTrackingWithEvent: nil];
       }
    }
    
  3. 取消后,将调用按钮的 UIControlEventTouchCancel 处理程序。

按钮触摸取消可以随时进行。例如,如果您想跟踪用户按住时间过长的情况,您可以在UIControlEventTouchDown处理程序中启动计时器,然后在计时器到期时取消触摸。

0

我不确定你的问题,但是你可以根据控件事件执行不同的操作,例如下面这样

[button addTarget:self
                     action:@selector(onTouchUpInside:)
           forControlEvents:(UIControlEventTouchUpInside)]; 

[button addTarget:self
                     action:@selector(onTouchDown:)
           forControlEvents:(UIControlEventTouchDown)]; 

[button addTarget:self
                     action:@selector(onTouchUpOutside:)
           forControlEvents:(UIControlEventTouchUpOutside)]; 

如果这不是您需要的或者对您没有帮助,请见谅。


我很感激你的努力,但我不确定那是否符合我的要求。 - daveMac

0

只需有一个BOOL变量来指示按钮动作是否允许,并在必要时进行检查。Enabled和userinteractionenabled只是为了通常禁用触摸。


但是,当按钮已经被按下时,我该如何取消触摸?使用布尔值可以防止触摸执行任何操作,但仍会显示正在被触摸。 - daveMac

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