如何识别所有四个方向的滑动手势

143

我需要使用滑动手势识别向下和向右的滑动手势。但是在 Swift 中,UISwipeGestureRecognizer 拥有预设的向右方向...而我不知道如何使用其他方向。

20个回答

3

编辑: "swift5.3"

首先创建一个baseViewController,并添加viewDidLoad这段代码:

class BaseViewController: UIViewController {             

     override func viewDidLoad() {
         super.viewDidLoad()
          let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
          swipeRight.direction = .right
          self.view.addGestureRecognizer(swipeRight)
          let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
          swipeLeft.direction = .left
          self.view.addGestureRecognizer(swipeLeft)
     }

     // Example Tabbar 5 pages
     @objc func swiped(_ gesture: UISwipeGestureRecognizer) {
         if gesture.direction == .left {
            if (self.tabBarController?.selectedIndex)! < 5 {
                self.tabBarController?.selectedIndex += 1
            }
         } else if gesture.direction == .right {
             if (self.tabBarController?.selectedIndex)! > 0 {
                 self.tabBarController?.selectedIndex -= 1
             }
         }
     }  
}

使用这个baseController类:

class YourViewController: BaseViewController {
    // its done. Swipe successful
    //Now you can use all the Controller you have created without writing any code.    
}

3

我喜欢@Fattie提出的方法(扩展),我已经用了很长时间来处理轻拍手势,只是将它作为UIView的扩展,而不是UIViewController。这是一个极大的时间节省方便。由于您可能不想启用所有四个笛卡尔方向,我默认为每个选择器设置为nil,以检查参数是否存在,使得激活给定方向的手势变成可选项。

我把参数名称稍微加长了一点,以加快在浏览代码时进行逆向工程,并重载了函数名称,因为没有理由不这样做。

extension UIView {
    func addSwipeRecognizer(direction: UISwipeGestureRecognizer.Direction, target: Any, action: Selector) {
        let recognizer = UISwipeGestureRecognizer(target: target, action: action)
        recognizer.direction = direction
        addGestureRecognizer(recognizer)
    }
    
    func addSwipeRecognizer(target: Any, left: Selector? = nil, right: Selector? = nil, up: Selector? = nil, down: Selector? = nil) {
        if let left  { addSwipeRecognizer(direction: .left,  target: target, action: left)  }
        if let right { addSwipeRecognizer(direction: .right, target: target, action: right) }
        if let up    { addSwipeRecognizer(direction: .up,    target: target, action: up)    }
        if let down  { addSwipeRecognizer(direction: .down,  target: target, action: down)  }
    }
    
    func addTapRecognizer(tapNumber: Int, target: Any, action: Selector) {
        let tap = UITapGestureRecognizer(target: target, action: action)
        tap.numberOfTapsRequired = tapNumber
        addGestureRecognizer(tap)
        isUserInteractionEnabled = true
    }
}

使用方法:

@objc func viewSwipedLeft()  { }
@objc func viewSwipedRight() { }
@objc func viewSwipedUp()    { }
@objc func viewSwipedDown()  { }

view.addSwipeRecognizer(target: self,
                             left:  #selector(viewSwipedLeft),
                             right: #selector(viewSwipedRight),
                             up:    #selector(viewSwipedUp),
                             down:  #selector(viewSwipedDown))

我非常赞同这个做法,我们也是这样做的! - Fattie

3
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let leftside = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
        leftside.direction = .left
        view.addGestureRecognizer(leftside)
        
        let rightside = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
        rightside.direction = .right
        view.addGestureRecognizer(rightside)
        
        
        let upside =  UISwipeGestureRecognizer(target: self, action: #selector(swiped))
        upside.direction = .up
        view.addGestureRecognizer(upside)
        
        let downside = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
        downside.direction = .down
        view.addGestureRecognizer(downside)
        
        // Do any additional setup after loading the view, typically from a nib.
    }
    @objc func swiped(gesture: UIGestureRecognizer){
        if let swipeGesture = gesture as? UISwipeGestureRecognizer{
            switch swipeGesture.direction{
            case UISwipeGestureRecognizer.Direction.left:
                view.backgroundColor = UIColor.red
            case UISwipeGestureRecognizer.Direction.right:
                view.backgroundColor = UIColor.yellow
            case UISwipeGestureRecognizer.Direction.up:
                view.backgroundColor = UIColor.green
            case UISwipeGestureRecognizer.Direction.down:
                view.backgroundColor = UIColor.blue
               
            default:
                "ERROR"
                
            }
        }
    }

}

2
当代码附带解释时,它会更有帮助。Stack Overflow是关于学习的,而不是提供盲目复制和粘贴的片段。请编辑您的问题并解释它如何回答特定的问题。请参见[答案]。 - Chris

3
在Swift 5中,
let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe))
swipeGesture.direction = [.left, .right, .up, .down]
view.addGestureRecognizer(swipeGesture)

3

经过一段时间的探索:

为所有4个方向添加滑动操作最短途径是:

override func viewDidLoad() {
    super.viewDidLoad()    
    for direction in [UISwipeGestureRecognizer.Direction.down, .up, .left, .right]{
        let swipeGest = UISwipeGestureRecognizer(target: self, action: #selector(swipeAction(_:)))
        swipeGest.direction = direction
        self.view.addGestureRecognizer(swipeGest)
    }
} 

@objc func swipeAction(_ gesture: UISwipeGestureRecognizer){
    switch gesture.direction {
    case UISwipeGestureRecognizer.Direction.right:
        print("Swiped right")
    case UISwipeGestureRecognizer.Direction.down:
        print("Swiped down")
    case UISwipeGestureRecognizer.Direction.left:
        print("Swiped left")
    case UISwipeGestureRecognizer.Direction.up:
        print("Swiped up")
    default: break
}

2

针对2022年

以下是在实际编程中可能会使用的代码。

您不会在视图控制器代码中添加所有样板代码。

在您的视图控制器中...

override func viewDidLoad() {
    super.viewDidLoad()
    pentaSceneView.buildFresh()
    addSwipesLRUD(#selector(swipeLeft), #selector(swipeRight),
                         #selector(swipeUp), #selector(swipeDown))
}

并且...

@objc func swipeLeft() {
    blah ...
}

@objc func swipeRight() {
    blah ...
}

@objc func swipeUp() {
    blah ...
}

@objc func swipeDown() {
    blah ...
}

你应该使用switch语句吗?答案:不要用。

苹果公司的代码 .direction 并没有出现太大问题,只是“非常愚蠢”,而且他们一直在更改它。使用switch语句既不比拥有四个函数更优雅,也不更短,而且当苹果(再次)稍微更改或合理化.direction的方式时,它很可能会出现错误。

这就是所需的简单扩展。

将此放入项目中的任何文件中,例如“Utils.swift”。每个实际项目都有一个“在此处进行扩展”类型的文件,在其中,您可以保留在所有项目中使用的非常常见的扩展。

extension UIViewController {
    ///Add a UISwipeGestureRecognizer.
    func addSwipe(_ d: UISwipeGestureRecognizer.Direction, _ s: Selector) {
        let g = UISwipeGestureRecognizer(target: self, action: s)
        g.direction = d
        view.addGestureRecognizer(g)
    }
    
    ///Add four swipes for left right up down.
    func addSwipesLRUD(_ l: Selector, _ r: Selector, _ u: Selector, _ d: Selector) {
        addSwipe(.left, l)
        addSwipe(.right, r)
        addSwipe(.up, u)
        addSwipe(.down, d)
    }
}

1
很棒的答案和通用建议。 - clearlight

1

对Nate的回答来说,只是更酷的Swift语法:

[UISwipeGestureRecognizerDirection.right,
 UISwipeGestureRecognizerDirection.left,
 UISwipeGestureRecognizerDirection.up,
 UISwipeGestureRecognizerDirection.down].forEach({ direction in
    let swipe = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
    swipe.direction = direction
    self.view.addGestureRecognizer(swipe)
 })

1
简单。只需按照下面的代码并享受。
//SwipeGestureMethodUsing
func SwipeGestureMethodUsing ()
{
    //AddSwipeGesture
    [UISwipeGestureRecognizerDirection.right,
     UISwipeGestureRecognizerDirection.left,
     UISwipeGestureRecognizerDirection.up,
     UISwipeGestureRecognizerDirection.down].forEach({ direction in
        let swipe = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
        swipe.direction = direction
        window?.addGestureRecognizer(swipe)
     })
}

//respondToSwipeGesture
func respondToSwipeGesture(gesture: UIGestureRecognizer) {

    if let swipeGesture = gesture as? UISwipeGestureRecognizer
    {
        switch swipeGesture.direction
        {
        case UISwipeGestureRecognizerDirection.right:
            print("Swiped right")
        case UISwipeGestureRecognizerDirection.down:
            print("Swiped down")
        case UISwipeGestureRecognizerDirection.left:
            print("Swiped left")
        case UISwipeGestureRecognizerDirection.up:
            print("Swiped up")
        default:
            break
        }
    }
}

1

对于Swift 5,它已经更新了

//Add in ViewDidLoad
let gesture = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.handleSwipe))
        gesture.direction = .right
        self.view.addGestureRecognizer(gesture)

//Add New Method
@objc func handleSwipe(sender: UISwipeGestureRecognizer) {
        print("swipe direction is",sender.direction)

    }

1
这怎么回答 OP 的问题呢?问题是要找到一种优雅的方法来为滑动手势识别器添加多个方向。 - shashwat

0

你可以通过声明一个函数来处理所有的 UISwipeGestureRecognizer 方向,这样就可以完成它了。以下是我的代码:

let swipeGestureRight = UISwipeGestureRecognizer(target: self, action:#selector(ViewController.respondToSwipeGesture(_:)) )
swipeGestureRight.direction = UISwipeGestureRecognizerDirection.right
self.view .addGestureRecognizer(swipeGestureRight)

let swipeGestureLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeGestureLeft.direction = UISwipeGestureRecognizerDirection.left
self.view.addGestureRecognizer(swipeGestureLeft)

let swipeGestureUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeGestureUp.direction = UISwipeGestureRecognizerDirection.up
self.view.addGestureRecognizer(swipeGestureUp)

let swipeGestureDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))
swipeGestureDown.direction = UISwipeGestureRecognizerDirection.down
self.view.addGestureRecognizer(swipeGestureDown)

这是处理滑动方向功能的函数:

func respondToSwipeGesture(_ sender: UIGestureRecognizer) {
    if let swipeGesture = sender as? UISwipeGestureRecognizer {
        switch swipeGesture.direction {
            case UISwipeGestureRecognizerDirection.right:
                print("right swipe")
            case UISwipeGestureRecognizerDirection.left:
                print("leftSwipe")
            case UISwipeGestureRecognizerDirection.up:
                print("upSwipe")
            case UISwipeGestureRecognizerDirection.down:
                print("downSwipe")
            default:
                break
        }
    }
}

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