Lined Notebook

Swift SwipeGestureRecognizer 사용하기 (좌, 우)

by 사슴비행기

SwipeSwipeGestureRecognizer는 말 그대로 좌우위아래로 Swipe하는 것이다.

여러 예제를 찾아서 사용해보려는데

내가 즐겨 보는 블로그(https://zeddios.tistory.com/345)에는 한가지 방향만 설정하는 것으로 되어 있었다.

하지만 내가 구현하려는 것은 좌우로 넘겼을 때 다음 페이지 이전 페이지로 이동하는 것이었다.

즉, B를 기준으로 왼쪽으로 넘기면 B를 dismiss 해서 A가 보이고

오른쪽으로 넘기면 C가 나타는 기능을 구현하고자 한다.

 

참고할만한 링크도 첨부한다.

https://nacham.tistory.com/15

 

iOS - UISwipeGestureRecognizer

touchesEnded, hitTest 등을 통해서 터치에 관한 이벤트를 커스텀하게 만들 수 있습니다. 그러나 정확한 제스쳐를 만들기 위해서는 어느정도의 수고스러움을 감내해야 합니다. 이 번거로움을 해결 할 수 있는 방법..

nacham.tistory.com

https://www.tutorialspoint.com/how-to-handle-right-to-left-and-left-to-right-swipe-gestures-on-ios-app

 

How to handle right-to-left and left-to-right swipe gestures on iOS App

How to handle right-to-left and left-to-right swipe gestures on iOS App - To handle gestures in iOS application we ll create an application with swift and see with help of an example This can be done in two ways with storyboard or programmatically Method 1

www.tutorialspoint.com

 

A <-> B <-> C

이런 구조로 만들 것이고, 각 클래스의 명은 아래와 같이 설정했다.

A = ViewController(기본)

B = GestureStartViewController

C = GestureEndViewController

 

storyboard의 구조는 아래와 같다.

코드는 아래와 같다.

 

A

-> 기본 코드에서 변경된것이 없음. main.storyboard에서 GestureTest버튼을 클릭하면 B로 넘어가게끔 show를 주었음.

 

B

-> storyboard에 B 화면에 Swipe Gesture Recognizer를 추가하고

추가한 Swipe Gesture Recognizer를 @IBOutlet 과 @IBAction으로 클래스와 연결해주었다.

UIGestureRecognizer 클래스에는

public init(target: Any?, action: Selector?) // designated initializer

와 같은 생성자(?)가 있는데 UISwipeGestureRecognizer는 이 UIGestureRecognizer를 상속 받았기 때문에

UISwipeGestureRecognizer(target: Any?, action: Selector?) 이렇게 사용해도 된다.

그래서 일단 UISwipeGestureRecognizer를 만든 다음에 방향을 지정해준다.

그러면 생성자에서 selector로 불려오는 함수에 sender로 UISwipeGestureRecognizer를 받은 다음 direction에 따라서 분기를 하면,

해당 방향으로 swipe 했을 때 원하는 작업을 할 수 있다.

나는 좌우만 하였지만 좌우위아래 모두 이런식으로 설정해주어도 된다. 위의 '참고할만한 링크' 참고

//
//  GestureStartViewController.swift
//  GestureTestProject
//
//  Created by office on 27/06/2019.
//  Copyright © 2019 수리. All rights reserved.
//

import UIKit

class GestureStartViewController: UIViewController {

    @IBAction func actGesture(_ sender: UISwipeGestureRecognizer) {
        if sender.direction == .left {
            print("left")
            guard let storyboard = self.storyboard else {
                return
            }
            guard let gestureEndViewController = storyboard.instantiateViewController(withIdentifier: "GestureEndViewController") as? GestureEndViewController else {
                return
            }
            self.present(gestureEndViewController, animated: true)
        }
        if sender.direction == .right {
            print("right")
            self.dismiss(animated: true)
        }
    }
    @IBOutlet var gestureStart: UISwipeGestureRecognizer!
    override func viewDidLoad() {
        super.viewDidLoad()
        let rr = UISwipeGestureRecognizer(target: self, action: #selector(actGesture(_:)))
        rr.direction = .right
        self.view.addGestureRecognizer(rr)
        let ll = UISwipeGestureRecognizer(target: self, action: #selector(actGesture(_:)))
        ll.direction = .left
        self.view.addGestureRecognizer(ll)
    }
    
    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

C

-> B와 똑같이 Swipe Gesture Recognizer를 storyboard에 추가하고 아래와 같이 코드를 작성하였다.

아래 코드는 https://zeddios.tistory.com/345 이 블로그의 글을 참고하여 작성해서 위의 코드와 조금 모양이 다르다.

단방향으로만 작업할 때는 이 코드를 써도 될 것 같다.

viewDidLoad에서 방향설정을 주석처리 한 것은 주석을 단 것처럼

UISwipeGestureRecognizer의 default 방향을 .right라서이다.

//
//  GestureEndViewController.swift
//  GestureTestProject
//
//  Created by office on 27/06/2019.
//  Copyright © 2019 수리. All rights reserved.
//

import UIKit

class GestureEndViewController: UIViewController {

    @IBAction func actEndGesture(_ sender: Any) {
        
        if gestureEnd.direction == .right {
            self.dismiss(animated: true)
            
        }
        
    }
    @IBOutlet var gestureEnd: UISwipeGestureRecognizer!
    override func viewDidLoad() {
        super.viewDidLoad()
        //만약 .left를 써야한다면, 아래 코드를 추가해야 한다. 왜냐면 UISwipeGestureRecognizer.Direction의 방향의 기본이 .right이기 때문이다.
//        gestureEnd.direction = .left
        // Do any additional setup after loading the view.
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */

}

블로그의 정보

Beautiful Coding

사슴비행기

활동하기