iOS 응용 (swift)

[iOS - swift] UIScreenEdgePanGestureRecognizer 개념

jake-kim 2024. 9. 30. 01:49

UIScreenEdgePanGestureRecognizer 개념 

https://developer.apple.com/documentation/uikit/uiscreenedgepangesturerecognizer

  • edge pan이라는 이름에서도 볼 수 있듯이 아이폰의 가장장리 부분으로부터 안쪽으로 드래그하면 동작하는 제스쳐
  • 이 인스턴스의 프로퍼티 중 알아야 하는 것은 edges
    • edges: 드래그의 시작점 (top, left, bottom, right, all)
let edgePanGesture = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handleEdgePan(_:)))
edgePanGesture.edges = .left
view.addGestureRecognizer(edgePanGesture)

ex) edgePanGesture를 등록하여 왼쪽에서 오른쪽으로 드래그하면 뷰의 배경색상을 변경하는 코드

class VC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        let edgePanGesture = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handleEdgePan(_:)))
        edgePanGesture.edges = .left
        view.addGestureRecognizer(edgePanGesture)
    }
    
    @objc func handleEdgePan(_ gesture: UIScreenEdgePanGestureRecognizer) {
        if gesture.state == .recognized {
            view.backgroundColor = UIColor(red: CGFloat.random(in: 0...1),
                                                green: CGFloat.random(in: 0...1),
                                                blue: CGFloat.random(in: 0...1),
                                                alpha: 1.0)
        }
    }
}

 

주의사항) swipe back 중복 제스처는 안됨

  • edges = .left로 설정한 경우, 왼쪽에서 오른쪽으로 스와이프할 때 navigationController의 swipe back이 활성화 되어있으면 swipe back만 우선 수행됨

ex) UIScreenEdgePanGestureRecognizer로 edges = .left로 걸어놓고 이 제스처가 먹으면 view.backgroundColor를 변경해주는 코드

class ViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let vc = VC()
        let vc2 = VC()
        
        let navi = UINavigationController(rootViewController: vc)
        present(navi, animated: true, completion: {
            navi.pushViewController(vc2, animated: true)
        })
    }
}

class VC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        let edgePanGesture = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handleEdgePan(_:)))
        edgePanGesture.edges = .left
        view.addGestureRecognizer(edgePanGesture)
    }
    
    @objc func handleEdgePan(_ gesture: UIScreenEdgePanGestureRecognizer) {
        if gesture.state == .recognized {
            view.backgroundColor = UIColor(red: CGFloat.random(in: 0...1),
                                                green: CGFloat.random(in: 0...1),
                                                blue: CGFloat.random(in: 0...1),
                                                alpha: 1.0)
        }
    }
}

UIScreenEdgePanGestureRecognizer은 동작안하고 swipe back이 우선으로 먹게됨

 

* 참고

- https://developer.apple.com/documentation/uikit/uiscreenedgepangesturerecognizer