IT

iOS 커스텀 네비게이션에서 Swipe Back Gesture 유지하는 방법 (iOS 26 대응)

초코모찌롤 2026. 3. 31. 16:47
반응형

iOS 커스텀 네비게이션에서 Swipe Back Gesture 유지하는 방법 (iOS 26 대응)

iOS에서 기본 UINavigationBar를 숨기고 커스텀 네비게이션을 사용하면 가장 많이 발생하는 문제가 바로 swipe back (뒤로가기 제스처)가 안 되는 현상이다.

특히 iOS 26에서는 네비게이션 내부 구조가 변경되면서 이 문제가 더 자주 발생한다.


1. 왜 swipe back gesture가 사라질까?

iOS의 뒤로가기 제스처는 내부적으로 interactivePopGestureRecognizer를 사용한다.

하지만 아래 상황에서 비활성화된다:

  • navigationBarHidden = true 상태
  • custom back button 사용
  • navigationController delegate 변경

즉, 커스텀 네비게이션을 쓰면 기본 제스처가 끊기는 구조다.


2. 가장 간단한 해결 방법

interactivePopGestureRecognizer를 다시 활성화하면 된다.

override func viewDidLoad() {
    super.viewDidLoad()
    
    navigationController?.interactivePopGestureRecognizer?.delegate = self
}

그리고 Delegate를 채택한다.

extension YourViewController: UIGestureRecognizerDelegate {

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

👉 이렇게 하면 다시 swipe back이 동작한다.


3. iOS 26에서 반드시 추가해야 하는 설정

iOS 26에서는 gesture가 더 엄격하게 관리되기 때문에 아래 설정을 함께 해주는 것이 안정적이다.

navigationController?.interactivePopGestureRecognizer?.isEnabled = true

그리고 충돌 방지를 위해:

navigationController?.interactivePopGestureRecognizer?.requiresExclusiveTouchType = false

4. BaseViewController로 공통 처리

실무에서는 모든 화면에 적용되도록 BaseViewController에서 처리하는 것이 좋다.

class BaseViewController: UIViewController, UIGestureRecognizerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        navigationController?.interactivePopGestureRecognizer?.delegate = self
        navigationController?.interactivePopGestureRecognizer?.isEnabled = true
    }

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

👉 모든 화면에서 자동으로 swipe back 유지 가능


5. 커스텀 back 버튼과 충돌 해결

커스텀 back 버튼을 사용하면 gesture가 막히는 경우가 있다.

이럴 때는 다음을 확인해야 한다:

  • leftBarButtonItem 대신 customView 사용 여부
  • UIButton에 gesture가 가로채지 않는지 확인

추천 방식:

button.addTarget(self, action: #selector(backClick), for: .touchUpInside)

👉 UIGestureRecognizer를 직접 추가하지 않는 것이 중요하다.


6. swipe back이 안 되는 대표적인 실수

  • viewDidLoad에서 navigationController nil 상태
  • gesture delegate를 nil로 설정
  • navigationController delegate를 덮어씀
  • scrollView panGesture와 충돌

특히 ScrollView와 함께 사용할 때는 충돌이 발생할 수 있다.


7. ScrollView와 Gesture 충돌 해결

다음 설정을 추가하면 충돌을 줄일 수 있다.

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                       shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

👉 horizontal scroll과 swipe back 동시 인식 가능


정리

문제 해결 방법
swipe back 안 됨 interactivePopGestureRecognizer delegate 설정
iOS 26 미동작 isEnabled = true 추가
스크롤 충돌 동시 gesture 허용
커스텀 버튼 충돌 UIButton target 방식 사용

마무리

커스텀 네비게이션을 사용할 때 swipe back gesture는 필수 UX 요소다.

특히 iOS 26에서는 내부 동작이 변경되었기 때문에 기존 방식으로는 동작하지 않는 경우가 많다.

위 방법을 적용하면 커스텀 네비게이션에서도 기본 iOS와 동일한 뒤로가기 경험을 유지할 수 있다.

반응형