RxGesture에서 View와 SubView가 동시에 인식되지 않도록 하는 방법

Posted on 2021-12-08 by GKSRUDTN99
Swift&Xcode Swift RxGesture RxSwift

  • View안에 작은 SubView가 그려진다고 할 때, 두 View에 모두 view.rx.tapGesture().when(.recognized)와 같은 방식으로 input binding을 했다면, subview를 터치하였을 때 superview와 subview 모두가 control Event를 방출한다. 이를 방지하기 위한 방법이 있다.

  • input binding을 다음과 같이 변경한다.

func bindInput() { 
  superView.rx.tapGesture(configuration: { gesture, delegate in 
    delegate.simultaneousRecognitionPolicy = .never
  }).when(.recognized)
    .bind(...)

  subView.rx.tapGesture(configuration: { gesture, delegate in 
    delegate.simultaneousRecognitionPolicy = .never
  }).when(.recognized)
    .bind(...)
}
  • 위와 같이 작성하면, 두 개의 View 모두가 ControlEvent를 방출하는 일은 없다.
  • 또는 Extension으로 다음과 같이 작성하는 방법도 있다.
extension Reactive where Base: RxGestureView { 
  public func tapGestureOnTop() -> TapControlEvent { 
    return self.tapGesture { gesture, delegate in 
      delegate.simultaneousRecognitionPolicy = .never
    }
  }
}

// subView.rx.tapGestureOnTop().when(.recognized)...

...
Anonymous    March 11, 2023, 10:43 p.m.

저도 동일한 상황이었는데 보고 참고하여 문제 해결하고 갑니다. 좋은 코드 보여주셔서 감사합니다!!