web-dev-qa-db-ja.com

Swiftでダブルタップジェスチャ認識機能を追加する方法

私はすでにシングルタップレコグナイザーを達成しましたが、そのシングルタップレコグナイザーをダブルタップにする方法を理解できません。いくつかのガイダンスを使用できます。

コード:

import Foundation
import UIKit

class MainBoardController: UIViewController{

    let tap = UITapGestureRecognizer()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        var swipe: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: "GotoProfile")
        swipe.direction = UISwipeGestureRecognizerDirection.Right
                    self.view.addGestureRecognizer(swipe)

        tap.addTarget(self, action: "GotoCamera")
        view.userInteractionEnabled = true
        view.addGestureRecognizer(tap)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func GotoProfile(){
        self.performSegueWithIdentifier("Profilesegue", sender: nil)
    }

    func GotoCamera(){
        self.performSegueWithIdentifier("Camerasegue", sender: nil)
    }
}
13
Hunter

私はこれを拡張機能で解決しました:

override func viewDidLoad() {
    super.viewDidLoad()

    let tapGR = UITapGestureRecognizer(target: self, action: #selector(PostlistViewController.handleTap(_:)))
    tapGR.delegate = self
    tapGR.numberOfTapsRequired = 2
    view.addGestureRecognizer(tapGR)
}

extension MainBoardController: UIGestureRecognizerDelegate {
    func handleTap(_ gesture: UITapGestureRecognizer){
        print("doubletapped")
    }
}
9
Marian König
     // Single Tap
    let singleTap: UITapGestureRecognizer =  UITapGestureRecognizer(target: self, action: #selector(PostDetailViewController.handleSingleTap(sender:)))
    singleTap.numberOfTapsRequired = 1
    self.viewTop.addGestureRecognizer(singleTap)

    // Double Tap
    let doubleTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(PostDetailViewController.handleDoubleTap))
    doubleTap.numberOfTapsRequired = 2
    self.viewTop.addGestureRecognizer(doubleTap)

    singleTap.require(toFail: doubleTap)
    singleTap.delaysTouchesBegan = true
    doubleTap.delaysTouchesBegan = true

   func handleSingleTap(sender: AnyObject?) {

    print("Single Tap!")

   }
   func handleDoubleTap() {

    print("Double Tap!")
   }

3行以下の魔法

    singleTap.require(toFail: doubleTap)
    singleTap.delaysTouchesBegan = true
    doubleTap.delaysTouchesBegan = true
10
Spydy

以下のコードを試してください

import UIKit

class MainBoardController: UIViewController{

let tap = UITapGestureRecognizer()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    var swipe: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: "GotoProfile")
    swipe.direction = UISwipeGestureRecognizerDirection.Right
    self.view.addGestureRecognizer(swipe)

    // DOUBLE TAP
    tap.numberOfTapsRequired = 2
    tap.addTarget(self, action: "GotoCamera")
    view.userInteractionEnabled = true
    view.addGestureRecognizer(tap)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func GotoProfile(){
    self.performSegueWithIdentifier("Profilesegue", sender: nil)
}

func GotoCamera(){
    self.performSegueWithIdentifier("Camerasegue", sender: nil)
}
}
9

シングルタップアクションとダブルタップアクションのコード例を次に示します。

シングルタップアクションにはコロン(handleSingleTap:)ですが、ダブルタップアクションはしません(handleDoubleTap)?これは、セレクターが引数を取ることを示します。したがって、以下の関数では、シングルタップの送信者を確認できます。これは、タップ機能を多くの要素に割り当てる場合に役立ちます。コロンがある場合は、関数にパラメーターが必要です。

override func viewDidLoad() {
    super.viewDidLoad()

    // Single Tap
    let singleTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleSingleTap:")
    singleTap.numberOfTapsRequired = 1
    self.view.addGestureRecognizer(singleTap)

    // Double Tap
    let doubleTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleDoubleTap")
    doubleTap.numberOfTapsRequired = 2
    self.view.addGestureRecognizer(doubleTap)
}

func handleSingleTap(sender: AnyObject?) {
    print("Single Tap!")
}
func handleDoubleTap() {
    print("Double Tap!")
}

注:この例では、シングルタップアクションをダブルタップで実行します。

5
Patrick

より迅速な方法:

view?.tap(numberOfTapsRequired: 2, action: action)

閉鎖:

private lazy var action: Action = Action(action: {[weak self] _ in
    print("Double click")
})

アクションへの参照を失わないことが非常に重要です(上記の例のようにフィールドとして作成できます)。

このUIView拡張機能を使用して: https://Gist.github.com/yoman07/7aae5abb957ff656b2f118ad1e6c2d36

0
Roman Barzyczak