UITapGestureRecognizer - 让它在降落时工作,而不是修饰?

use*_*541 78 objective-c ios uitapgesturerecognizer swift

我正在使用tap事件是非常时间敏感的,所以我很好奇是否有可能在用户简单触摸时激活UITapGestureRecognizer,而不是要求它们也能触摸起来?

Rob*_*way 176

使用UILongPressGestureRecognizer并将其设置minimumPressDuration为0.在UIGestureRecognizerStateBegan状态期间,它将像触地一样.

对于Swift 4

func setupTap() {
    let touchDown = UILongPressGestureRecognizer(target:self, action: #selector(didTouchDown))
    touchDown.minimumPressDuration = 0
    view.addGestureRecognizer(touchDown)
}

@objc func didTouchDown(gesture: UILongPressGestureRecognizer) {
    if gesture.state == .began {
        doSomething()
    }
}
Run Code Online (Sandbox Code Playgroud)

对于Objective-C

例:

-(void)setupLongPress
{
   self.longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(didLongPress:)];
   self.longPress.minimumPressDuration = 0;
   [self.view addGestureRecognizer:self.longPress];
}

-(void)didLongPress:(UILongPressGestureRecognizer *)gesture
{
   if (gesture.state == UIGestureRecognizerStateBegan){
      [self doSomething];
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些喜欢界面构建器(我)的人来说,也可以在IB中设置minimumPressDuration(谢谢Rob的优秀解决方案) (4认同)
  • 一个不错的解决方法+1。“ minimumPressDuration”可以为0 tho。 (2认同)

LE *_*ANG 128

创建自定义TouchDownGestureRecognizer子类并在touchesBegan中实现手势:

TouchDownGestureRecognizer.h

#import <UIKit/UIKit.h>

@interface TouchDownGestureRecognizer : UIGestureRecognizer

@end
Run Code Online (Sandbox Code Playgroud)

TouchDownGestureRecognizer.m

#import "TouchDownGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h>

@implementation TouchDownGestureRecognizer
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    if (self.state == UIGestureRecognizerStatePossible) {
        self.state = UIGestureRecognizerStateRecognized;
    }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    self.state = UIGestureRecognizerStateFailed;
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    self.state = UIGestureRecognizerStateFailed;
}


@end
Run Code Online (Sandbox Code Playgroud)

执行:

#import "TouchDownGestureRecognizer.h"
    TouchDownGestureRecognizer *touchDown = [[TouchDownGestureRecognizer alloc] initWithTarget:self action:@selector(handleTouchDown:)];
    [yourView addGestureRecognizer:touchDown];

-(void)handleTouchDown:(TouchDownGestureRecognizer *)touchDown{
    NSLog(@"Down");
}
Run Code Online (Sandbox Code Playgroud)

Swift实现:

import UIKit
import UIKit.UIGestureRecognizerSubclass

class TouchDownGestureRecognizer: UIGestureRecognizer
{
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent)
    {
        if self.state == .Possible
        {
            self.state = .Recognized
        }
    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent)
    {
        self.state = .Failed
    }

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent)
    {
        self.state = .Failed
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是2017年粘贴的Swift语法:

import UIKit.UIGestureRecognizerSubclass

class SingleTouchDownGestureRecognizer: UIGestureRecognizer {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        if self.state == .possible {
            self.state = .recognized
        }
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
        self.state = .failed
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
        self.state = .failed
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是替代品的替代品UITap.所以在代码中......

func add(tap v:UIView, _ action:Selector) {
    let t = UITapGestureRecognizer(target: self, action: action)
    v.addGestureRecognizer(t)
}
Run Code Online (Sandbox Code Playgroud)

你可以放心地交换....

func add(hairtriggerTap v:UIView, _ action:Selector) {
    let t = SingleTouchDownGestureRecognizer(target: self, action: action)
    v.addGestureRecognizer(t)
}
Run Code Online (Sandbox Code Playgroud)

测试显示它不会被多次调用.它可以作为替代品; 你可以在两个电话之间切换.

  • 导入"UIGestureRecognizerSubclass.h"的额外+1.尼斯. (10认同)
  • 不应该在touchesBegin,touchesMoved,touchesEnded方法中调用超级? (3认同)
  • @JasonSilberman你忘了#import <UIKit/UIGestureRecognizerSubclass.h> (3认同)

Sur*_*gch 21

Swift(没有子类化)

这是一个类似于Rob Caraway的Objective-C答案的Swift版本.

我们的想法是使用minimumPressDuration设置为零的长按手势识别器,而不是使用轻敲手势识别器.这是因为长按手势识别器报告触摸开始事件而敲击手势没有.

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Add "long" press gesture recognizer
        let tap = UILongPressGestureRecognizer(target: self, action: #selector(tapHandler))
        tap.minimumPressDuration = 0
        myView.addGestureRecognizer(tap)
    }

    // called by gesture recognizer
    @objc func tapHandler(gesture: UITapGestureRecognizer) {

        // handle touch down and touch up events separately
        if gesture.state == .began {
            // do something...
            print("tap down")
        } else if gesture.state == .ended { // optional for touch up event catching
            // do something else...
            print("tap up")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)