首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >UITapGestureRecognizer -让它在触地上工作,而不是在触碰上?

UITapGestureRecognizer -让它在触地上工作,而不是在触碰上?
EN

Stack Overflow用户
提问于 2013-03-26 10:10:38
回答 3查看 59.9K关注 0票数 90

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

EN

回答 3

Stack Overflow用户

发布于 2013-08-05 23:23:31

使用UILongPressGestureRecognizer并将其minimumPressDuration设置为0。在UIGestureRecognizerStateBegan状态下,它的行为就像是触碰。

对于Swift 4+

代码语言:javascript
复制
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()
    }
}

对于Objective-C

代码语言:javascript
复制
-(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];
   }
}
票数 197
EN

Stack Overflow用户

发布于 2016-07-01 18:55:25

Swift (无子类化)

这是一个类似于Rob Caraway's Objective-C answer的Swift版本。

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

代码语言:javascript
复制
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")
        }
    }
}
票数 24
EN

Stack Overflow用户

发布于 2016-02-21 19:00:12

这是另一种解决方案。创建UIControl的子类。你甚至可以在故事板中像UIView一样使用它,因为UIControl是UIView的子类。

代码语言:javascript
复制
class TouchHandlingView: UIControl {
}

并对其执行addTarget:

代码语言:javascript
复制
@IBOutlet weak var mainView: TouchHandlingView!
...

mainView.addTarget(self, action: "startAction:", forControlEvents: .TouchDown)
...

然后,指定的操作将像UIButton一样被调用:

代码语言:javascript
复制
func startAction(sender: AnyObject) {
    print("start")
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15628133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档