4 방향으로 스 와이프를 인식하는 방법


131

스 와이프 제스처를 아래로 인식 한 다음 인식하려면 스 와이프를 사용해야합니다. 그러나 빠른 UISwipeGestureRecognizer에서 올바른 방향을 미리 결정했습니다. 그리고 다른 방향으로 사용하는 방법을 모르겠습니다.

답변:


324

UISwipeGestureRecognizer각 방향마다 하나씩 있어야합니다 . UISwipeGestureRecognizer.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
        }
    }
}

스위프트 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
        }
    }
}

"각 인식기는 한 방향 만 처리 할 수 ​​있습니다"-사실이 아닙니다. 참조 stackoverflow.com/questions/16184539/...
세르게이 Skoblikov

3
"각 인식기는 한 방향 만 처리 할 수 ​​있습니다"-Swift에서는 true이고 Objective-C에서는 구체적입니다.
King-Wizard

13
당신 UISwipeGestureRecognizerDirection.Down요법 앞에 추가 할 필요가 없습니다 . swipeDown.direction = .Down충분하다면 사용 하십시오. 그냥 팁 =)
Paul Peelen 8:28에

동일한 제스처를 두 개 이상의 뷰에 추가 할 수 있습니까?
Max

3
@Sergey Skoblikovs의 신속한 접근 방식을 수행하면 swipe.direction = [.Right,.Down,.Up,.Left] 하여) 인식기가 호출되지 않을 수도 있습니다. 아마도 이는 신속한 문제이지만 현재는 작동하지 않습니다.
Knight0fDragon

55

나는 이것을 기여하는 것처럼 느꼈고 결국 더 우아해 보입니다.

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

10
self.addGestureRecognizer(gesture)나를 위해 오류가 발생했습니다. 무엇을 고정하는 것은이었다 self.view.addGestureRecognizer(gesture);.
ahitt6345

1
@ ahitt6345 나는 UIView서브 클래스 에서 내 코드를 사용하고 있었지만 당신이에 있다면 당신은 절대적으로 맞습니다 UIViewController!
Alexandre Cassagne

1
깨끗하고 최선의 대답입니다.
Christopher Smit

22

스토리 보드에서 :

  1. 보기에 4 개의 스 와이프 제스처 인식기를 추가하십시오.
  2. 속성 관리자의 대상 방향으로 각각을 설정하십시오. 오른쪽, 왼쪽, 위 또는 아래를 선택할 수 있습니다
  3. 하나씩 스 와이프 제스처 인식기를 선택하고보기 컨트롤러로 제어 + 드래그합니다. 이름을 입력하고 (왼쪽 제스처, 오른쪽 제스처, upGesture 및 downGesture라고 함) 연결을 다음으로 변경하십시오. 조치 및 유형 : 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")
}  

5
이 답변을 통해 많은 코드를 작성할 필요는 없지만 스토리 보드와 스토리 보드와 코드 간의 연결을 사용합니다. 개발자가 이러한 방식으로 작업하는 것을 선호하는 경우이 답변이 더 쉬울 수 있지만 개발자가 코딩 작업을 더 선호하는 경우 첫 번째 답변이 가장 좋습니다.
user3099333

나는 하나 대신 4 개의 스 와이프 제스처를 사용했으며 많은 작업 부하가 코딩 대신 스토리 보드에 있습니다.
user3099333

9

최근에 상황이 바뀐 것 같습니다. 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 의 편리한 확장을 사용 하십시오 .

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

swipeGesture.direction = [.Down, .Up]
self.view.addGestureRecognizer(swipeGesture)

5
선택기가 호출되었지만 발신자의 방향이 올바르지 않습니다. 다시 말해,이 방법은 스 와이프의 방향을 알 필요는 없지만 그렇지 않으면 좋습니다.
Robert Gummesson

더 이상 작동하지 않습니다. Swift 3에서 컨텍스트는 첫 번째 값으로 제공되어야합니다.[UISwipeGestureRecognizerDirection.right, .left, .up, .down]
Brent Faust 17

7

Apple Swift 버전 3.1-Xcode 버전 8.3 (8E162)

Alexandre Cassagne의 접근 방식에서 편리한 방법

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

1
이 특정 빌드 defaults write com.apple.dt.xcode IDEPlaygroundDisableSimulatorAlternateFramebuffer -bool YES에서는 일부 하드웨어의 버그를 수정하기 위해 터미널에서 실행해야합니다 . 새로운 버전의 Xcode
Sirens

6

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)

전의:

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

이 함수를 다음과 같이 호출하십시오.

//Remove swipe gesture
self.willMoveFromView(view: self.transparentView)

이와 같이 나머지 방향을 쓸 수 있으며 스크롤보기 가 있는지 아래에서 위로 또는 그 반대로 있는지주의하십시오.

스크롤보기가 있으면 위에서 아래로 충돌 하고 제스처를 볼 수 있습니다.


4

UISwipeGestureRecognizerdirection다음과 같은 정의가 속성을 :

var direction: UISwipeGestureRecognizerDirection

이 제스처 인식기의 스 와이프가 허용 된 방향입니다.


Swift 3.0.1 (및 이하)의 문제점은을 UISwipeGestureRecognizerDirection준수 하더라도 OptionSet다음 스 니펫이 컴파일되지만 긍정적 인 결과가 나오지 않는다는 것입니다.

// This compiles but does not work
let gesture = UISwipeGestureRecognizer(target: self, action: #selector(gestureHandler))
gesture.direction = [.right, .left, .up, .down]
self.addGestureRecognizer(gesture)

이 문제를 해결하려면 UISwipeGestureRecognizer원하는 각각에 대해 를 만들어야합니다 direction.


다음 Playground 코드는 Array의 메소드를 사용하여 UISwipeGestureRecognizer동일 UIView하고 동일하게 여러 가지를 구현하는 방법을 보여줍니다 .selectormap

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

xcode 8.3에서 여전히 같은 문제-컴파일되었지만 작동하지 않음-왼쪽과 오른쪽으로 돌아 왔습니다UISwipeGestureRecognizerDirection(rawValue: 15)
John

4

원하는 뷰로 제스처를 스 와이프하거나 @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")
    }
}

3

출근 제스처 에서 스위프트 (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")
    }
}

2

먼저 다음 코드를 만들고 "swift4"코드를 baseViewController추가 viewDidLoad하십시오.

class BaseViewController: UIViewController {             

     override func viewDidLoad() {
         super.viewDidLoad()
         let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
         swipeRight.direction = UISwipeGestureRecognizerDirection.right
         self.view.addGestureRecognizer(swipeRight)
         let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(swiped))
         swipeLeft.direction = UISwipeGestureRecognizerDirection.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.    
}

2

스위프트 5에서는

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

1

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

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

잠시 동안 파고 들자 :

네 방향 모두에 스 와이프추가 하는 가장 짧은 방법 은 다음과 같습니다.

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
}

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

0

그냥 : ( 스위프트 4.2.1 )

UISwipeGestureRecognizer.Direction.init(
  rawValue: UISwipeGestureRecognizer.Direction.left.rawValue |
            UISwipeGestureRecognizer.Direction.right.rawValue |
            UISwipeGestureRecognizer.Direction.up.rawValue |
            UISwipeGestureRecognizer.Direction.down.rawValue
)

2
코드에 설명을 추가하면 더 좋을 것입니다.
Poul Bak

0

들어 스위프트 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)

    }

이것은 OP의 질문에 어떻게 대답합니까? 문제는 스 와이프 제스처 인식기에 여러 방향을 추가하는 우아한 방법을 찾는 것이 었습니다.
shashwat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.