触摸时取消 UIButton 触摸

Posted

技术标签:

【中文标题】触摸时取消 UIButton 触摸【英文标题】:Cancel UIButton touch while touching it 【发布时间】:2013-02-08 15:57:46 【问题描述】:

我有一种情况,用户会触摸 UIButton,虽然他们可能已经在触摸它,但我需要能够取消它或导致它失败。

我曾尝试使用 button.enabled 和 userInteractionEnabled,但两者都不能即时工作。两者都必须在触摸开始之前设置。

我可以让按钮在被触摸后和被触摸时失效吗?

【问题讨论】:

您是要取消后台进程还是取消按钮连接的直接出口? 【参考方案1】:

您需要为按钮注册两项操作,一项用于触摸,一项用于触摸。在着陆时,您可以决定是否要取消;在 touch up 中,编写按钮按下的实际逻辑。

[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];

有关参考,请参阅the documentation of -cancelTrackingWithEvent: in UIControl

【讨论】:

【参考方案2】:

解决问题的方法之一是根据您的需要自定义按钮的按下外观。采用: – setBackgroundImage:@"NormalStateImage.png" forState: UIControlStateNormal – setBackgroundImage:@"HighlightedStateImage.png" forState: UIControlStateHighlighted

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

【讨论】:

这是我目前的解决方法,但似乎我应该能够以某种方式取消触摸。 您可以取消触摸。但是你必须以不同的方式处理它们。您必须实现UIResponder 的响应触摸事件。检查此 Apple 文档 developer.apple.com/library/ios/#documentation/uikit/reference/… 和本教程 mobile.tutsplus.com/tutorials/iphone/… hitTest 这样的东西不会更简单吗?【参考方案3】:

这可以为任何UIButton 完成。如果您想在用户按下按钮时取消按钮按下,这些步骤应该有效:

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

    [yourButton addTarget: self
                   action: @selector(buttonIsDownHandler:)
         forControlEvents: UIControlEventTouchDown];
    

    在handler中,决定是否取消按下

    -(IBAction) buttonIsDownHandler: (id) sender
    
       if (needToCancelThisPress)
       
          [yourButton cancelTrackingWithEvent: nil];
       
    
    

    取消后将调用UIControlEventTouchCancel 的按钮处理程序。

可以随时取消按钮触摸取消。例如,如果您想跟踪用户何时按住太久,您可以在UIControlEventTouchDown 处理程序中启动一个计时器,然后在计时器到期时取消触摸。

【讨论】:

【参考方案4】:

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

【讨论】:

但是在按钮已经被按下后如何取消触摸?使用布尔值,我可以阻止触摸做任何事情,但它仍然会显示它正在被触摸。【参考方案5】:

不确定您的问题,但您可以根据控制事件采取不同的操作,如下所示

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

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

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

如果没有帮助或您正在寻找什么,请原谅。

【讨论】:

感谢您的努力,但我不确定这就是我所追求的。

以上是关于触摸时取消 UIButton 触摸的主要内容,如果未能解决你的问题,请参考以下文章

如果移出 CGPoint 则取消触摸

touchesBegan 和 touchesEnded 未在 UIButton 上调用

Swift:在自定义视图中未调用 UIButton 触摸事件

UIButton图像动画

如何禁用标准 UIButton 触摸事件

UIButton - 触摸时保持文本黑色