티스토리 뷰

728x90
반응형

+ 추가내용

navigationBar 가 히든된 경우와 더불어 left bar button item 을 사용하게 되면 스와이프 제스처로 pop 이 되지 않는 현상이 발생했어요! 그리고 발견한 버그와 해결 방법도 들구왔답니다!

그래서 이전의 게시물과 합해서 내용을 좀 더 구체적으로 적어볼까한다.

iOS) 스와이프해서 pop 하기

interactivePopGestureRecognizer

  • navigationBar 를 숨기지 않은 상태와 backIndicator 를 사용하는 상태(시스템이 자연스럽게 제공하는 뒤로가기 버튼)라면 좌측에서 우측으로 스와이프하면 push 된 뷰컨이 pop 된다. 하지만 다음과 같이 숨김 상태와 left bar button item 을 사용하는 상태라면
navigationController?.navigationBar.isHidden = true

// image, selector 는 해당 매개변수에 맞는 변수들이 들어간 상태.
navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: self, action: selector)

스와이프해도 pop 되지 않는다.

이때 interactivePopGestureRecognizer 를 사용하면 pop 할 수 있다,

override func viewDidLoad() {
    super.viewDidLoad()

    navigationController?.interactivePopGestureRecognizer?.isEnabled = true
    navigationController?.interactivePopGestureRecognizer?.delegate = self
}

//...

extension ViewController: UIGestureRecognizerDelegate { }

1️⃣

navigationController?.interactivePopGestureRecognizer?.isEnabled = true

위의 코드 없이도 동작이 가능하지만 혹여나 특정 뷰컨트롤러에서 interactivePopGestureRecognizer?.isEnabled = false 로 스와이프해서 pop 하는 것을 막아두고 싶을 경우가 있기 때문에 다시금 적용하기 위한 코드이다.

✨ interactivePopGestureRecognizer

네비게이션 스택에서 top view controller 를 pop 하는 역할의 gesture recognizer 이다.

2️⃣

navigationController?.interactivePopGestureRecognizer?.delegate = self

//...
// UIGestureRecognizerDelegate 채택
extension ViewController: UIGestureRecognizerDelegate { }

✅ 아래와 같은 코드로 구현하는 경우

아래의 코드처럼 구현해도 스와이프를 통해서 pop 이 가능했어요! 그래서 많은 블로그들이 UINavigationController 를 extension 해서 아래의 코드를 통해서 모든 네비게이션 컨트롤러의 뷰컨트롤러에서 스와이프해서 pop(구글에서는 'swipe back gesture' 등의 용어로 통하더라구요.) 을 구현했어요.

    navigationController?.interactivePopGestureRecognizer?.delegate = nil

그랬더니 아래와 같은 버그가 등장했어요..!

✅ interactivePopGestureRecognizer 버그

navigationController?.interactivePopGestureRecognizer?.delegate = nil
// or
navigationController?.interactivePopGestureRecognizer?.delegate = self

구글링을 통해서 위의 코드들로만 진행하게 되면 root view controller 에서 스와이프를 진행하게 되면 아래의 버그를 만들수도 있다고 해요.

root view controller 에서 스와이프를 하며그 이후에 아무런 작동을 하지 않는 현상이 발생한다.

참고

[SwiftUI]커스텀 백버튼 백 제스처 시 화면 멈춤 이슈 해결

[Swift] interactivePopGestureRecognizer 버그? - 초림이의 연구실

다음과 같이 root view controller 가 아닐경우에만 true 값을 넣어주도록 하면 해결이 가능하답니다.

navigationController?.interactivePopGestureRecognizer?.delegate = self

// ...

extension ViewController: UIGestureRecognizerDelegate {
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return navigationController?.viewControllers.count ?? 0 > 1
    }
}

gestureRecognizerShouldBegin(_:)

gesture recognizer 가 터치 해석을 시작해야하는지 delegate 에게 묻는다.

Parameter

  • gestureRecognizer : UIGestureRecognizer 의 하위 클래스 인스턴스이다. 이 gesture recognizer 는 제스처가 발생하는지 확인하기 위해서 터치 처리를 시작하려고 한다.

Return Value

true(기본 값)는 gesture recognizer 에게 터치 해석을 계속하도록 지시하고, false 는 제스처 인식을 막습니다.

결과

🤔 UIGestureRecognizerDelegate 에 대한 참고자료

iOS ) ScrollView에서 위아래 Gesture를 감지하고싶다면? / UIGestureRecognizerDelegate


출처

팬제스처와 네비게이션 팝(뒤로가기) 제스처가 상충되는 문제 해결하기

UINavigationController Interactive Pop Gesture Not Working?

728x90
반응형
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
링크
Total
Today
Yesterday