如何识别所有4个方向的滑动

use*_*367 123 direction swipe ios uiswipegesturerecognizer swift

我需要使用滑动来识别向下然后向右滑动手势.但是在快速的UISwipeGestureRecognizer上预先确定了正确的方向..而且我不知道如何使用其他方向.

Nat*_*ook 304

你需要UISwipeGestureRecognizer为每个方向都有一个.这有点奇怪,因为该UISwipeGestureRecognizer.direction属性是一个选项风格的位掩码,但每个识别器只能处理一个方向.如果需要,您可以将它们全部发送到同一个处理程序,并将其排序,或将它们发送给不同的处理程序.这是一个实现:

override func viewDidLoad() {
    super.viewDidLoad()

    var swipeRight = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
    swipeRight.direction = UISwipeGestureRecognizerDirection.Right
    self.view.addGestureRecognizer(swipeRight)

    var swipeDown = UISwipeGestureRecognizer(target: self, action: "respondToSwipeGesture:")
    swipeDown.direction = UISwipeGestureRecognizerDirection.Down
    self.view.addGestureRecognizer(swipeDown)
}

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特3:

override func viewDidLoad() {
    super.viewDidLoad()

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

    let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
    swipeDown.direction = UISwipeGestureRecognizerDirection.down
    self.view.addGestureRecognizer(swipeDown)
}

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您不必在`.Down`等前面添加`UISwipeGestureRecognizerDirection`.如果足够的话,只需使用`swipeDown.direction = .Down`.只是小费=) (11认同)
  • "每个识别器只能处理一个方向" - 在Swift中是真的,而在Objective-C中则是假的. (3认同)
  • 如果你在swift中执行@Sergey Skoblikovs的方法,(通过执行`swipe.direction = [.Right,.Down,.Up,.Left]`),识别器甚至不会被调用,也许这是swift的一个问题,但截至目前不起作用. (3认同)

Ale*_*gne 49

我只是想做出贡献,最后看起来更优雅:

func addSwipe() {
    let directions: [UISwipeGestureRecognizerDirection] = [.Right, .Left, .Up, .Down]
    for direction in directions {
        let gesture = UISwipeGestureRecognizer(target: self, action: Selector("handleSwipe:"))
        gesture.direction = direction
        self.addGestureRecognizer(gesture)
    }
}

func handleSwipe(sender: UISwipeGestureRecognizer) {
    print(sender.direction)
}
Run Code Online (Sandbox Code Playgroud)

  • `self.addGestureRecognizer(gesture)`给我造成了错误.修正它的是`self.view.addGestureRecognizer(手势);`. (9认同)

use*_*333 21

从故事板:

  1. 在视图中添加四个滑动手势识别器.
  2. 使用属性检查器中的每个目标方向设置每个方向.您可以选择向右,向左,向上或向下
  3. 逐个选择滑动手势识别器,控制+拖动到视图控制器.插入名称(让我们说leftGesture,rightGesture,upGesture和downGesture),将连接更改为:Action并输入:UISwipeGestureRecognizer

从你的viewController:

@IBAction func rightGesture(sender: UISwipeGestureRecognizer) {
    print ("Right")
}
@IBAction func leftGesture(sender: UISwipeGestureRecognizer) {
    print ("Left")
}
@IBAction func upGesture(sender: UISwipeGestureRecognizer) {
    print = ("Up")
}

@IBAction func downGesture(sender: UISwipeGestureRecognizer) {
    print ("Down")
}  
Run Code Online (Sandbox Code Playgroud)

  • 通过这个答案,您不需要编写大量代码,而是使用故事板和故事板与代码之间的连接.如果开发人员更喜欢以这种方式工作,这个答案可能会更容易,但如果开发人员更喜欢在编码方面工作更多,那么第一个答案肯定是最好的. (5认同)

Bog*_*rca 8

看起来事情最近发生了变化.在XCode 7.2中,以下方法有效:

override func viewDidLoad() {
    super.viewDidLoad()

    let swipeGesture = UISwipeGestureRecognizer(target: self, action: "handleSwipe:")
    swipeGesture.direction = [.Down, .Up]
    self.view.addGestureRecognizer(swipeGesture)
}

func handleSwipe(sender: UISwipeGestureRecognizer) {
    print(sender.direction)
}
Run Code Online (Sandbox Code Playgroud)

在iOS 8.4和9.2上以及9.2上的实际设备上进行了测试.

或者,在这里使用mlcollard的方便扩展:

let swipeGesture = UISwipeGestureRecognizer() {
    print("Gesture recognized !")
}

swipeGesture.direction = [.Down, .Up]
self.view.addGestureRecognizer(swipeGesture)
Run Code Online (Sandbox Code Playgroud)

  • 可以调用选择器,但发送方的方向不正确.换句话说,如果您不需要知道滑动的方向,则此方法很好. (5认同)

Joh*_*ohn 6

Apple Swift 3.1版 - Xcode版本8.3(8E162)

亚历山大·卡萨涅的方法很方便

let directions: [UISwipeGestureRecognizerDirection] = [.up, .down, .right, .left]
for direction in directions {
    let gesture = UISwipeGestureRecognizer(target: self, action: #selector(YourClassName.handleSwipe(gesture:)))
    gesture.direction = direction
    self.view?.addGestureRecognizer(gesture)   
}

func handleSwipe(gesture: UISwipeGestureRecognizer) {
    print(gesture.direction)
    switch gesture.direction {
    case UISwipeGestureRecognizerDirection.down:
        print("down swipe")
    case UISwipeGestureRecognizerDirection.up:
        print("up swipe")
    case UISwipeGestureRecognizerDirection.left:
        print("left swipe")
    case UISwipeGestureRecognizerDirection.right:
        print("right swipe")
    default:
        print("other swipe")
    }
}
Run Code Online (Sandbox Code Playgroud)


iOS*_*iOS 5

在Swift 4.2和Xcode 9.4.1中

将动画委托CAAnimationDelegate添加到您的课程

//Swipe gesture for left and right
let swipeFromRight = UISwipeGestureRecognizer(target: self, action: #selector(didSwipeLeft))
swipeFromRight.direction = UISwipeGestureRecognizerDirection.left
menuTransparentView.addGestureRecognizer(swipeFromRight)

let swipeFromLeft = UISwipeGestureRecognizer(target: self, action: #selector(didSwipeRight))
swipeFromLeft.direction = UISwipeGestureRecognizerDirection.right
menuTransparentView.addGestureRecognizer(swipeFromLeft)

//Swipe gesture selector function
@objc func didSwipeLeft(gesture: UIGestureRecognizer) {
    //We can add some animation also
    DispatchQueue.main.async(execute: {
            let animation = CATransition()
            animation.type = kCATransitionReveal
            animation.subtype = kCATransitionFromRight
            animation.duration = 0.5
            animation.delegate = self
            animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
            //Add this animation to your view
            self.transparentView.layer.add(animation, forKey: nil)
            self.transparentView.removeFromSuperview()//Remove or hide your view if requirement.
        })
}

//Swipe gesture selector function
@objc func didSwipeRight(gesture: UIGestureRecognizer) {
        // Add animation here
        DispatchQueue.main.async(execute: {
            let animation = CATransition()
            animation.type = kCATransitionReveal
            animation.subtype = kCATransitionFromLeft
            animation.duration = 0.5
            animation.delegate = self
            animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
            //Add this animation to your view
            self.transparentView.layer.add(animation, forKey: nil)
            self.transparentView.removeFromSuperview()//Remove or hide yourview if requirement.
        })
}
Run Code Online (Sandbox Code Playgroud)

如果要从视图中删除手势,请使用此代码

self.transparentView.removeGestureRecognizer(gesture)
Run Code Online (Sandbox Code Playgroud)

例如:

func willMoveFromView(view: UIView) {
    if view.gestureRecognizers != nil {
        for gesture in view.gestureRecognizers! {
            //view.removeGestureRecognizer(gesture)//This will remove all gestures including tap etc...
            if let recognizer = gesture as? UISwipeGestureRecognizer {
                //view.removeGestureRecognizer(recognizer)//This will remove all swipe gestures
                if recognizer.direction == .left {//Especially for left swipe
                    view.removeGestureRecognizer(recognizer)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样调用此函数

//Remove swipe gesture
self.willMoveFromView(view: self.transparentView)
Run Code Online (Sandbox Code Playgroud)

这样,您可以写下剩余的方向,请注意是否具有从下到上的滚动视图,反之亦然

如果您具有滚动视图,则从上到下会发生冲突,反之亦然。


Doc*_*oca 5

滑动手势到您想要的视图,或基于@Alexandre Cassagne 的Swift 5 和 XCode 11 中的视图控制器整个视图

override func viewDidLoad() {
    super.viewDidLoad()

    addSwipe()
}

func addSwipe() {
    let directions: [UISwipeGestureRecognizer.Direction] = [.right, .left, .up, .down]
    for direction in directions {
        let gesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe))
        gesture.direction = direction
        self.myView.addGestureRecognizer(gesture)// self.view
    }
}

@objc func handleSwipe(sender: UISwipeGestureRecognizer) {
    let direction = sender.direction
    switch direction {
        case .right:
            print("Gesture direction: Right")
        case .left:
            print("Gesture direction: Left")
        case .up:
            print("Gesture direction: Up")
        case .down:
            print("Gesture direction: Down")
        default:
            print("Unrecognized Gesture Direction")
    }
}
Run Code Online (Sandbox Code Playgroud)