HItTest의 목적이 어떤 View가 Touch를 받을지 찾는 것이라면, Responder Chain은 HitTest다음에 일어나는 일으로써 이벤트에 따라 어떤 Responder가 이벤트를 받을지를 정해주는 과정이다.
이 과정이 마치 Chain처럼 연쇄적으로 연결이 되어있다고 해서 Responder Chain이라 불리운다.
HitTest로 View를 찾았지만 그 View가 이벤트를 처리를 안할 수도 있기 때문에, 만약 이벤트를 처리를 못했다면
다음 Responder를 상속받은 View로 넘어갈 것이다.
이렇게 이벤트가 처리가 될때까지 Chain으로 이어져 있는것.
만약 끝까지 갔는데도 처리가 안되면 이벤트는 버려짐.
UIResponder?
Responding하고 Event를 핸들링 하기 위한 추상적인 인터페이스.
UIView,UIWindow,UIApplication 등등 모두 UIResponder를 상속하고 있다.
UIResponder를 상속한 것들은 이벤트를 처리할 수 있는데 그 이벤트들은 HItTest때 보았던,,
touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:) 등등..
여러 이벤트들을 Handling 할수 있다.
하지만 우리가 직접 구현을 안해도 잘된다??
보통은 우리가 View를 생성하고 SubView를 추가한다든지의 작업을 하면, UIResponder들이 알아서 연결이 되어있다. (자기들끼리 끊어지기도함.)
First Responder?
이름에서 알 수 있다시피 처음으로 이벤트를 받을 수 있는 Responder를 의미함.
만약, 어떤 이벤트를 특정한 Reponder가 처리하도록 하고 싶다면 First Reponder로 지정하면 된다.
next 메서드를 통해 다음 Responder를 알아낼수 있고 지정도 가능하다.
예를들어 Aresponder -> Bresponder -> Cresponder가 있으면
A의 next는 B, B의 Next는 C이다.
이 때, B에게 전달을 해주기 싫으면 A의 next를 C로 바꾸어 주면 된다.
응답체인이 끊어지는 경우
1. 응답체인이 끊어지는 경우라는 것은 이벤트를 넘기지 않고 자기 자신이 다 처리한다는 의미
Ex)TableView, CollectionView, ScrollView
ScrollView를 상속 받는 View들은 스크롤이 항상 우선시 되어야 하기 때문에 터치 이벤트를 넘겨 주지 않는다.(응답 체인들이 끊어진다)
2. User Interaction을 끄는 경우.
isUserInteractionEnabled 프로퍼티를 끄는 경우 View는 그래도 보이겠지만 touch와 같은 interaction들은 모두 무시가 됨.
3. 뷰가 안보이는 경우
clipToBounds로 짤릴때, hidden이 되어있을때,alpha값도 일정 값 이하로 내려가면 interactione들이 무시가 됨.
First Responder를 어따쓰나?
iOS에서 가장 흔히 볼수 있는 경우는 TextField를 사용하는 경우이다.
TextField에 focus가 가게 하려면 FirstResponder로 지정을 해주어야 한다.
반대로, TextFiled의 입력을 안하고 싶어서 focus를 빼고싶다 -> resignFirstResponder를 이용해 FirstResponder로 지정된 것을 해제 해주어야 함.
태클 및 피드백은 언제나 환영입니다~
'iOS' 카테고리의 다른 글
서버없이 Networking Test하기 with URLProtocol (2) | 2022.05.15 |
---|---|
iOS Cache (2) | 2022.04.24 |
iOS에서 일어난 touch가 처리되는 과정. (0) | 2022.03.29 |
AutoLayout - 2 (0) | 2021.08.23 |
AutoLayout - 1 (0) | 2021.08.23 |
댓글