Ios 如何识别四个方向的刷卡

Ios 如何识别四个方向的刷卡,ios,swift,swipe,direction,uiswipegesturerecognizer,Ios,Swift,Swipe,Direction,Uiswipegesturerecognizer,我需要使用滑动来识别向下然后向右滑动的手势。但在swift上,手势识别器已经预先确定了正确的方向。。我不知道如何将其用于其他方向。每个方向都需要一个UISweepGestureRecognitor。这有点奇怪,因为uisweegesturecognizer.direction属性是一个选项样式的位掩码,但每个识别器只能处理一个方向。如果需要,您可以将它们全部发送到同一个处理程序,并在那里进行排序,或者将它们发送到不同的处理程序。下面是一个实现: override func viewDidLoad

我需要使用滑动来识别向下然后向右滑动的手势。但在swift上,手势识别器已经预先确定了正确的方向。。我不知道如何将其用于其他方向。

每个方向都需要一个
UISweepGestureRecognitor
。这有点奇怪,因为
uisweegesturecognizer.direction
属性是一个选项样式的位掩码,但每个识别器只能处理一个方向。如果需要,您可以将它们全部发送到同一个处理程序,并在那里进行排序,或者将它们发送到不同的处理程序。下面是一个实现:

override func viewDidLoad() {
    super.viewDidLoad()

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

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

@objc func respondToSwipeGesture(gesture: UIGestureRecognizer) {

    if let swipeGesture = gesture as? UISwipeGestureRecognizer {

        switch swipeGesture.direction {
        case .right:
            print("Swiped right")
        case .down:
            print("Swiped down")
        case .left:
            print("Swiped left")
        case .up:
            print("Swiped up")
        default:
            break
        }
    }
}
Swift 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
        }
    }
}
从故事板:

  • 在视图中添加四个滑动手势识别器
  • 使用属性检查器中的目标方向设置每个方向。你可以 选择右、左、上或下
  • 逐个选择滑动手势识别器,控制并拖动到视图控制器。插入名称(让我们说LeftSignature、RightSignature、UpSignature和 向下手势),将连接更改为:操作,并将类型更改为: 手势识别器
  • 从您的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")
    }  
    

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

    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)
    }
    

    看起来最近情况有所改变。在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)
    }
    
    在iOS 8.4和9.2上的模拟器上进行测试,并在9.2上的实际设备上进行测试

    或者,使用mlcollard的便捷扩展:


    UISwipeGestureRecognizer
    具有具有以下定义的属性:

    var direction: UISwipeGestureRecognizerDirection
    
    此手势识别器允许的滑动方向


    Swift 3.0.1(及以下版本)的问题在于,即使
    UISWIPgestureRecognitizerDirection
    符合,以下代码段仍将编译,但不会产生任何积极的预期结果:

    // This compiles but does not work
    let gesture = UISwipeGestureRecognizer(target: self, action: #selector(gestureHandler))
    gesture.direction = [.right, .left, .up, .down]
    self.addGestureRecognizer(gesture)
    
    作为一种解决方法,您必须为每个所需的
    方向创建
    uisweegestureerecognizer


    以下代码显示了如何使用数组的
    map
    方法为相同的
    UIView
    和相同的
    selector
    实现多个
    uisweegesturecognizer

    import UIKit
    import PlaygroundSupport
    
    class SwipeableView: UIView {
        convenience init() {
            self.init(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
            backgroundColor = .red
    
            [UISwipeGestureRecognizerDirection.right, .left, .up, .down].map({
                let gesture = UISwipeGestureRecognizer(target: self, action: #selector(gestureHandler))
                gesture.direction = $0
                self.addGestureRecognizer(gesture)
            })
        }
    
        func gestureHandler(sender: UISwipeGestureRecognizer) {
            switch sender.direction {
            case [.left]:   frame.origin.x -= 10
            case [.right]:  frame.origin.x += 10
            case [.up]:     frame.origin.y -= 10
            case [.down]:   frame.origin.y += 10
            default:        break
            }
        }
    }
    
    class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
            view.backgroundColor = .white
            view.addSubview(SwipeableView())
        }
    }
    
    let controller = ViewController()
    PlaygroundPage.current.liveView = controller
    
    Apple Swift 3.1版-Xcode 8.3版(8E162)


    只需声明一个函数即可完成,该函数将处理您的所有滑动UISweepGestureRecognitor方向。这是我的密码:

    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)
    
    以下是处理swipedirection功能的函数:

    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
            }
        }
    }
    

    对于Nate的回答,只是一个更酷的快速语法:

    [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)
     })
    

    简单。只需按照下面的代码进行操作即可享受

    //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
            }
        }
    }
    

    在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.
            })
    }
    
    如果要从视图中删除手势,请使用此代码

    self.transparentView.removeGestureRecognizer(gesture)
    
    例:

    像这样调用这个函数

    //Remove swipe gesture
    self.willMoveFromView(view: self.transparentView)
    
    这样,您可以写下剩余的方向,请注意是否从下到上滚动视图,反之亦然


    如果您有滚动视图,您将获得从上到下的冲突,并查看相反的手势。

    首先创建
    baseViewController
    并添加
    viewDidLoad
    此代码“swift4”:

    就像那样:(Swift 4.2.1

    uisweegesturecognizer.Direction.init(
    rawValue:UISweepGestureRecognitor.Direction.left.rawValue|
    UISweepGestureRecognitor.Direction.right.rawValue|
    UISweepGestureRecognitor.Direction.up.rawValue|
    UISweepGestureRecognitor.Direction.down.rawValue
    )
    
    Swift 5中滑动手势

      override func viewDidLoad() {
        super.viewDidLoad()
        let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
        swipeLeft.direction = .left
        self.view!.addGestureRecognizer(swipeLeft)
    
        let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
        swipeRight.direction = .right
        self.view!.addGestureRecognizer(swipeRight)
    
        let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
        swipeUp.direction = .up
        self.view!.addGestureRecognizer(swipeUp)
    
        let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
        swipeDown.direction = .down
        self.view!.addGestureRecognizer(swipeDown)
    }
    
    @objc func handleGesture(gesture: UISwipeGestureRecognizer) -> Void {
        if gesture.direction == UISwipeGestureRecognizer.Direction.right {
            print("Swipe Right")
        }
        else if gesture.direction == UISwipeGestureRecognizer.Direction.left {
            print("Swipe Left")
        }
        else if gesture.direction == UISwipeGestureRecognizer.Direction.up {
            print("Swipe Up")
        }
        else if gesture.direction == UISwipeGestureRecognizer.Direction.down {
            print("Swipe Down")
        }
    }
    

    对于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)
    
        }
    

    挖了一段时间后:

    向所有四个方向添加滑动的最短路径是:

    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
    }
    

    将手势滑动到所需的视图,或在Swift 5和XCode 11中基于

    在Swift 5中

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

    “每个识别器只能处理一个方向”-这不是真的。请参阅“每个识别器只能处理一个方向”-具体而言,Swift中为真,Objective-C中为假。您不必在
    .Down
    前面添加
    UIWipegestureRecognizerDirection
    。如果足够的话,只需使用
    swipeDown.direction=.Down
    。只需提示=)我们可以将同一个手势识别器对象添加到多个视图中吗?我已经尝试过,但没有成功。如果您在swift中使用@Sergey Skoblikovs的方法,(通过执行
    swipe.direction=[.Right、.Down、.Up、.Left]
    ),识别器甚至不会被调用,也许这是swift的问题,但是到目前为止还不起作用。根据这个答案,你不需要写很多代码,但是你可以使用故事板以及故事板和代码之间的连接。如果开发人员更喜欢以这种方式工作,这个答案可能会更简单,但是如果开发人员更喜欢在编码方面工作,那么第一个答案肯定是最好的。我使用了4个滑动手势而不是一个,并且大量的工作负载在情节提要中而不是编码。
    self.addgestureRecognitizer(手势)
    为我造成了一个错误。修正它的是self.view.addgestureRecognitizer(手势)
    @ahitt6345我在
    UIView
    子类中使用我的代码,但是如果您在
    UIViewController
    中,那么您是绝对正确的!干净,对我来说是最好的答案。可能会调用选择器,但发送器上的方向不正确。换句话说,如果你不需要知道刷卡的方向,这种方法很好,但不需要知道其他的。不再有效。在Swift 3中,必须将上下文提供给第一个值:
    [uisweegestureRecognitizerDirection.right、.left、.up、.down]
    同样的问题仍然存在于xcode 8.3中-已编译但不起作用-我只得到了左和右返回的
    uisweegestureRecognitizerDirection(rawValue:15)
    对于此特定版本,您需要运行
    默认值write com.apple.dt.xcode ideplaygrounddisablesimulator alternateframebuffer-
    
    class YourViewController: BaseViewController {
        // its done. Swipe successful
        //Now you can use all the Controller you have created without writing any code.    
    }
    
      override func viewDidLoad() {
        super.viewDidLoad()
        let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
        swipeLeft.direction = .left
        self.view!.addGestureRecognizer(swipeLeft)
    
        let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
        swipeRight.direction = .right
        self.view!.addGestureRecognizer(swipeRight)
    
        let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
        swipeUp.direction = .up
        self.view!.addGestureRecognizer(swipeUp)
    
        let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(handleGesture))
        swipeDown.direction = .down
        self.view!.addGestureRecognizer(swipeDown)
    }
    
    @objc func handleGesture(gesture: UISwipeGestureRecognizer) -> Void {
        if gesture.direction == UISwipeGestureRecognizer.Direction.right {
            print("Swipe Right")
        }
        else if gesture.direction == UISwipeGestureRecognizer.Direction.left {
            print("Swipe Left")
        }
        else if gesture.direction == UISwipeGestureRecognizer.Direction.up {
            print("Swipe Up")
        }
        else if gesture.direction == UISwipeGestureRecognizer.Direction.down {
            print("Swipe Down")
        }
    }
    
    //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)
    
        }
    
    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
    }
    
    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")
        }
    }
    
    let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe))
    swipeGesture.direction = [.left, .right, .up, .down]
    view.addGestureRecognizer(swipeGesture)