[iOS] Touch Handling - 터치 이벤트를 특정 뷰로 전달하기
맵뷰 가지고 놀다보니 이 녀석 터치 이벤트를 꼭꼭 잘 씹어먹는다. 서브뷰를 올려서 처리하는 건 맵뷰를 컨트롤 해야되서 상당히 귀찮고, 맵뷰 자체를 오버라이딩 해서 하는 것도 방법이겠지만 잘 안되었다. (그러니까 시작은 how to detect MapView touch event? 이라는 것이지 -_-)
결국 어디선가 답을 찾았다. 윈도우(UIWindow)의 sendEvent를 오버라이딩 하는 방법으로 처리해보니 아주 잘 되더라. (코드에서 touchListener는 그냥 UIView 형식의 프로퍼티다.)
ps. super의 sendEvent를 먼저 실행해 버리면 event가 정리되는지 제대로 동작이 안되었던 경험이 있는데... 진실이 뭔지는 모름. :p
ps2. 이 코드를 쓰면 Apple측에서 Ban 할거라는 이야기가 있다. 내가 생각해도 좀 위험할 것 같기도 하다. 이런 코드는 Cydia에 올릴 때나 쓰는게 좋을 듯.
결국 어디선가 답을 찾았다. 윈도우(UIWindow)의 sendEvent를 오버라이딩 하는 방법으로 처리해보니 아주 잘 되더라. (코드에서 touchListener는 그냥 UIView 형식의 프로퍼티다.)
- (void)sendEvent:(UIEvent *)event { if (event.type == UIEventTypeTouches && touchListener != nil) { NSSet *set = [event allTouches]; UITouch *touch = [set anyObject]; if (touch.phase == UITouchPhaseBegan) { [touchListener touchesBegan:set withEvent:event]; } // ... } [super sendEvent:event]; }여러 용도로 활용 가능할 듯.
ps. super의 sendEvent를 먼저 실행해 버리면 event가 정리되는지 제대로 동작이 안되었던 경험이 있는데... 진실이 뭔지는 모름. :p
ps2. 이 코드를 쓰면 Apple측에서 Ban 할거라는 이야기가 있다. 내가 생각해도 좀 위험할 것 같기도 하다. 이런 코드는 Cydia에 올릴 때나 쓰는게 좋을 듯.
댓글