반응형

스와이프(Swipe)로 뒤로가기 처리 (iOS 7 이후)

// Swipe Back 지원을 위함
extension UINavigationController: UIGestureRecognizerDelegate {
    open override func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        viewControllers.count > 1
    }
}

 

위 코드로는 왼쪽 영역에서 스와이프만 되는데 전체 영역에 스와이프 하기위해서는 다음과 같이 하면 됩니다.

 

기본 NavigationController 대신에 SwipeNavigationController를 사용하게 되면

왼쪽 절반 영역에서 panGesture 했을때 Swipe Back 기능을 사용할  수 있습니다. (영역 설정은 자유로이 가능)

class SwipeNavigationController: UINavigationController {
  private lazy var panGestureRecognizer = UIPanGestureRecognizer()
  override func viewDidLoad() {
    super.viewDidLoad()
    setupView()
  }
}

private extension SwipeNavigationController {
  func setupView() {
    guard let interactivePopGestureRecognizer,
          let targets = interecivePopGestureRecognizer.value(forKey: "targets") else {
         return 
    }
    panGestureRecognizer.setValue(targets, forKey: "targets")
    panGestureRecognizer.delegate = self
    view.addGestureRecognizer(panGestureRecognizer)
  }
}

extension SwipeNavigationController: UIGestureRecognizerDelegate {
  func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    gestureRecognizer.location(in: view).x <= view.center.x && viewControllers.count > 1
  }
}

 

반응형
Posted by 까칠코더
,