Swift SwipeGestureRecognizer 사용하기 (좌, 우)
by 사슴비행기SwipeSwipeGestureRecognizer는 말 그대로 좌우위아래로 Swipe하는 것이다.
여러 예제를 찾아서 사용해보려는데
내가 즐겨 보는 블로그(https://zeddios.tistory.com/345)에는 한가지 방향만 설정하는 것으로 되어 있었다.
하지만 내가 구현하려는 것은 좌우로 넘겼을 때 다음 페이지 이전 페이지로 이동하는 것이었다.
즉, B를 기준으로 왼쪽으로 넘기면 B를 dismiss 해서 A가 보이고
오른쪽으로 넘기면 C가 나타는 기능을 구현하고자 한다.
참고할만한 링크도 첨부한다.
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.
}
*/
}
'swift > code trim' 카테고리의 다른 글
webView 사용하기(WKWebView) (0) | 2019.08.05 |
---|---|
Swift button text 변경하기 (0) | 2019.07.01 |
Swift storyboard 객체 만들기 and 뷰 객체 만들기 (0) | 2019.06.27 |
swift 변수 타입 확인하는 방법 (0) | 2019.06.26 |
Swift @escaping 을 써보자 (0) | 2019.06.25 |
블로그의 정보
Beautiful Coding
사슴비행기