iOS检测用户触摸释放

6
这可能已经在这里发布过了,但我找不到它。我正在编写一个简单的iOS应用程序,其中包含两个UIView。用户将首先按住屏幕上的某个区域,然后释放他们的触摸,然后快速触摸下面的第二个视图。
第一个UIView附加了一个UILongPressGestureRecognizer并正常工作。第二个UIView附加了一个UITapGestureRecognizer并且也能正常工作。然而,我无法获得这些手势识别器之一返回任何说明用户释放了他们的触摸的内容。
我尝试了这段代码,但没有效果:
- (void)holdAction:(UILongPressGestureRecognizer *)holdRecognizer
{
    if (UIGestureRecognizerStateRecognized) {
        holdLabel.text = @"Holding Correctly. Release Touch when ready.";
        holdView.backgroundColor = [UIColor greenColor];
    } else if (UIGestureRecognizerStateCancelled){
        holdLabel.text = @"Ended";
        holdView.backgroundColor = [UIColor redColor];
}

任何建议都是很棒的,特别是如果有人知道如何实现返回用户触摸设备状态的调用。我已经查看了开发者文档,但没有任何结果。

你可以使用按钮代替视图吗?UIButton具有TouchUpInside事件。 - ott--
3个回答

12

经过几个小时的调试,我找到了一个可以工作的方法,不确定这是否是最好的方法。结果发现我需要按照下面的代码进行编写。我没有调用在viewDidLoad()方法中声明的特定UIGestureRecognizer。

- (void)holdAction:(UILongPressGestureRecognizer *)holdRecognizer
{
    if (holdRecognizer.state == UIGestureRecognizerStateBegan) {
        holdLabel.text = @"Holding Correctly. Release when ready.";
        holdView.backgroundColor = [UIColor greenColor];
    } else if (holdRecognizer.state == UIGestureRecognizerStateEnded)
    {
        holdLabel.text = @"You let go!";
        holdView.backgroundColor = [UIColor redColor];
    }
}

很棒的解决方案。我添加了 [holdGesture setMinimumPressDuration:0.01]; 以使其更具响应性。 - Segev

2
您需要在这里使用手动触摸处理(而不是使用手势识别器)。任何UIResponder子类都可以实现以下四个方法:
 touchesBegan:withEvent:
 touchesMoved:withEvent:
 touchesEnded:withEvent:
 touchesCancelled:withEvent:

使用这些方法,您可以访问触摸事件的每个阶段。 您可能需要实现自己的逻辑来检测长按事件,但您可以完全访问所有触摸事件。
有关触摸处理的更多信息,请参阅WWDC 2011的此会话(需要开发人员帐户):

https://developer.apple.com/itunes/?destination=adc.apple.com.8270634034.08270634040.8367260921?i=1527940296


我想观看这个会话,但链接已经失效了,如果您能编辑一下就太好了。谢谢。 - Mathias

1
Swift 4+
 let gesture = UILongPressGestureRecognizer(target: self, action:  #selector(self.checkAction))
    self.view.addGestureRecognizer(gesture)


     @objc func checkAction(sender : UILongPressGestureRecognizer) {
        if sender.state == .ended || sender.state == .cancelled || sender.state == .failed {

        }
    }

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