2010년 8월 26일 목요일

[iOS] Touch Handling - 터치 이벤트를 특정 뷰로 전달하기

맵뷰 가지고 놀다보니 이 녀석 터치 이벤트를 꼭꼭 잘 씹어먹는다. 서브뷰를 올려서 처리하는 건 맵뷰를 컨트롤 해야되서 상당히 귀찮고, 맵뷰 자체를 오버라이딩 해서 하는 것도 방법이겠지만 잘 안되었다. (그러니까 시작은 how to detect MapView touch event? 이라는 것이지 -_-)

결국 어디선가 답을 찾았다. 윈도우(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에 올릴 때나 쓰는게 좋을 듯.

댓글 없음 :