【问题标题】:How do I implement the UITapGestureRecognizer into my application如何在我的应用程序中实现 UITapGestureRecognizer
【发布时间】:2012-07-06 12:38:50
【问题描述】:

我对编程和 Objective C 很陌生。我想知道如何制作一个具有空白屏幕和一分钟计时器的应用程序。你应该尽可能快地点击,只要你可以。我想知道如何在我的代码中实现UITapGestureRecognizer

【问题讨论】:

标签: ios objective-c user-interface uigesturerecognizer uitapgesturerecognizer


【解决方案1】:

这是关于如何在课堂上实现手势识别器的分步指南:

  1. 使您的班级符合UIGestureRecognizerDelegate 协议。

  2. 实例化手势识别器。例如,要实例化一个UITapGestureRecognizer,我们将这样做:

    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
    

    这里,action 是处理手势的选择器。在这里,我们的选择器 handleTapFrom 看起来像:

    - (void) handleTapFrom: (UITapGestureRecognizer *)recognizer
    {
        //Code to handle the gesture
    }
    

    选择器的参数是手势识别器。我们可以使用这个手势识别器来访问它的属性,例如,我们可以找到手势识别器的状态,比如UIGestureRecognizerStateBeganUIGestureRecognizerStateEnded等。

  3. 在实例化的手势识别器上设置所需的属性。例如,对于UITapGestureRecognizer,我们可以设置属性numberOfTapsRequirednumberOfTouchesRequired

  4. 将手势识别器添加到要检测手势的视图中。在我们的示例代码中(我将分享该代码供您参考),我们将使用以下代码行将手势识别器添加到 imageView:

    [self.imageView addGestureRecognizer:tapGestureRecognizer];
    
  5. 将手势识别器添加到视图后,设置手势识别器的委托,即处理所有手势识别器内容的类。在我们的示例代码中,它会是这样的:

    tapGestureRecognizer.delegate = self;
    

    注意:在将手势识别器添加到视图后分配委托。否则不会调用action方法。

【讨论】:

  • 非常感谢你们的帮助!
  • 没什么好遗憾的。降价格式有一个学习曲线。
  • 由于您使用 (target:self) 分配手势,是不是将它的委托设置为 self 并且符合 UIGestureRecognizerDelegate 协议有点多余?我从来没有设置过委托,也没有实现过协议,我只是用@selector的签名实现了这个方法,一切对我来说都很好..
  • 不需要第 1 步。 UIGestureRecognizerDelegate 用于实现手势识别器的类,而不是用于使用手势识别器的类。
  • @MathewVarghese - 我遇到了一个奇怪的行为 - 当我在将手势识别器添加到视图后设置委托时 - 我遇到了错误的访问崩溃。如果我之前添加了委托 - 一切都按预期工作。任何线索为什么会发生这种情况?
【解决方案2】:

Swift 中的示例:

import UIKit

class ViewController: UIViewController {

    @IBOutlet var myUIImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let singleTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "myUIImageViewTapped:")
        singleTap.numberOfTapsRequired = 1
        singleTap.numberOfTouchesRequired = 1
        self.myUIImageView.addGestureRecognizer(singleTap)
        self.myUIImageView.userInteractionEnabled = true
    }

    func myUIImageViewTapped(recognizer: UITapGestureRecognizer) {
        if(recognizer.state == UIGestureRecognizerState.Ended){
            println("myUIImageView has been tapped by the user.")
        }
    }

}

【讨论】:

  • 没错,userInteractionEnabled 是必不可少的。谢谢!
  • 我不明白为什么需要检查“recognizer.state == UIGestureRecognizerState.Ended”。我对此进行了测试,没有它也可以。我的假设是您需要它来进行多次点击手势识别,但对于单击,我们还需要它吗?
  • numberOfTapsRequired 和 numberOfTouchesRequired 的默认值都是 1。代码中的这两行是不必要的。
【解决方案3】:
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[self.tableView addGestureRecognizer:gestureRecognizer];
self.tableView.userInteractionEnabled = YES;
gestureRecognizer.cancelsTouchesInView = NO;  // this prevents the gesture recognizers to 'block' touches

【讨论】:

  • 如何传递自定义参数
【解决方案4】:

适用于 Xcode 11.4、Swift 5

class ViewController: UIViewController {

    @IBOutlet weak var targetView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchCallback(_:)))
        self.targetView.addGestureRecognizer(tap)
    }

    @objc func touchCallback(_ sender: UITapGestureRecognizer? = nil) {
        if(sender?.state == .ended) {
            print("tapped")
        }
    }
}

// If you want to touch start, available touchesBegan
class ViewController: UIViewController {

    @IBOutlet weak var targetView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()
    }


    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
          for touch in touches {
              let location = touch.location(in: targetView)
              print(location)
          }
      }
}

【讨论】:

    【解决方案5】:

    如果您使用 Swift (iOS9) 和 SpriteKit,请尝试以下操作。

    class GameScene: SKScene {
        override func didMoveToView(view: SKView) {
            let singleTap = UITapGestureRecognizer(target:self, action:#selector(self.handleSingleTap:))
            singleTap.numberOfTouchesRequired = 1
            singleTap.addTarget(self, action:#selector(self.handleSingleTap))
            view.userInteractionEnabled = true
            view.addGestureRecognizer(singleTap)
        }
        //event handler
        func handleSingleTap(sender:UITapGestureRecognizer){
            print("tapped")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2010-09-07
      • 1970-01-01
      • 2023-04-07
      • 2021-11-17
      相关资源
      最近更新 更多