WooKoo Blog

물과 같이

개발/개발

[iOS] - Responder Chain

WooKoo 2022. 8. 4. 20:56

오늘은 Responder Chain 에 대해서 정리해보려고합니다.

 

Responder에 대해서 먼저 알아야겠죠?

Responder는 이벤트를 핸들링 및 이벤트에 반응 할 수 있는 객체입니다.

UIResponder에서 상속된 클래스의 인스턴스들이죠

저희가 개발하면서 자주 사용하는 UIApplication, UIViewController, UIView(UIButton, UITextField 등) 모든 사용자가 이벤트를 발생시키는 것들은 responder 객체에 보냅니다.

 

예시를 하나 들어볼게요

 

한 화면에 뷰가 있고  그 안에 서브 뷰로 텍스트 필드가 있다고 가정합시다.

 

사용자가 텍스트필드를 탭하면 이에 반응하며 키보드가 올라오죠??

 

가장 처음으로 이벤트가 발생한 텍스트 필드! 그것이 바로 first responder가 됩니다.

 

한 화면에 진입하고 텍스트 필드 자동으로 키보드 올라오게 할 때 becomeFirstResponder에 대해서 한번쯤 경험해보셨을 것 같아요

 

이런 이벤트를 핸들링하는 것 외에도 reponder들은 처리되지 않은 이벤트를 전달하기도합니다.

 

특정 responder가 이벤트를 받지 않았을 때 그 이벤드는 다음 상위 객체로 포워딩하죠

 

이렇게 쭉쭉쭉 올라갔는데도 아무도 처리를 하지 않을 경우 해당 이벤트를 버리게 됩니다. 

 

 

일반적으로 처음 터치된 뷰를 시작으로 window 객체를 거쳐 UIApplicationDelegate에 전달되죠

특히 터치 이벤트를 안먹어보신 경우 일땐 리스폰더를 고려해보는게 좋아요

ex 1. Cell 안에 버튼이 있는데 안눌릴 때

     2. 뷰 위에 버튼을 올렸는데 뷰를 벗어난 영역은 터치가 안될 때 

터치의 위치가 뷰의 경계 밖이라면 hitTest 메서드는 모든 이벤트를 무시해요

이를 사용하려면 hitTest를 override해서 사용해줘야합니다.

터치 영역을 늘리고싶거나, 무시하고싶거나 한 경우에 말이죠

 

아래에는 이를 오버라이드해서 쓸 수 있는 예시들을 잘 정리해주신 블로그에요

한번 참고해서 개발에 도움이 되셨으면 좋겠습니다.

 

https://mrgamza.tistory.com/526

 

출처

https://seizze.github.io/2019/11/26/iOS%EC%9D%98-Responder%EC%99%80-Responder-Chain-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0.html