2017-03-24 14 views
0

UIControl을 확장하고 touchesBegan:withEvent:touchesEnded:withEvent: 메서드를 확장하는 클래스가 있습니다.UIControl 하위 클래스에 터치 종료 이벤트 보내기

다른 클래스에서 서브 클래스의 인스턴스에 touchesEnded:withEvent:이 호출되도록하고 싶습니다.

이 :

[myControl sendActionsForControlEvents:UIControlEventTouchUpInside]; 

이 두 방법 중 어느 하나를 발생하지 않습니다 호출하세요. 당신이 합성을 할 경우

+0

당신은 때 우선 그 슈퍼 메서드를 호출 했습니까? – honcheng

+1

아니, 당신은 그 방법의 슈퍼를 호출하지 않습니다. –

+0

나는 그것을 정의 제스처 인식 자와 혼동했다. – honcheng

답변

0
  1. 는/당신은 할 수 없습니다, 다음 -touchesEnded:withEvent:에 매개 변수로 UIControl 서브 클래스로 전송 (손가락으로 화면 접촉 없음) UITouch 이벤트를 생성합니다.

    Apple에서 생성 할 수 없으며 iOS만이 Responder Chain을 따라 UITouch 이벤트를 생성하고 배포 할 수 있습니다. 구글이 "UITouch 합성"을한다면 문서화되지 않은 방법이있다. 그러나 애플은 이것들에 적대적이며 그들을 사용하는 애플 리케이션을 거부한다.

  2. 당신이

    [myControl sendActionsForControlEvents:UIControlEventTouchUpInside];

    을 게시 한 코드는 해당 컨트롤의 이벤트 (TouchUpInside)가 트리거 될과 관련된 조치가 발생합니다. touchesBegan/Moved/Ended에는 영향을주지 않습니다. 당신이 -sendActionsForControlEvents;를 전송하여 컨트롤에 할당 된 작업 -handleTap 및 대상 viewController를 가지고 있다면 당신은 차단하고 일부 (즉, 아이폰 OS를 실제 터치 이벤트를 리디렉션 할 경우에만 메시지를 다음과 같은 원인

    [viewController handleTap];

  3. 를 확인할 수 있습니다 것 이유는 UIControl 하위 클래스로 전송되지 않습니다.) Reponder Chain의 객체 (표시되는 UIView (및 하위 클래스) 계층과 "활성"보기 컨트롤러, 응용 프로그램 대리자 및 UIApplication 객체)에서 수행하는 것이 가장 쉽습니다. 그냥 전화 내부에 자신의 -touchesBegan/이전/종단 방법과 둥지를 오버라이드 (override),하지만 난 당신이 생각 확신이

-touchesEnded:NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [myControl touchesEnded:touches withEvent:event]; }

  • 당신이 원하기 때문에
      -touchesBegan/Moved/Ended을 무시하는 대신 자신의 클래스에서 메서드를 호출하려면 UITouch & UIEvent 매개 변수가 필요하지 않은 UIControl 하위 클래스에 사용자 지정 메서드를 추가하고 호출하면됩니다. 예를

    -(void)touchAt:(CGPoint)location { //react to touch }

    와 다른 클래스에서 호출 들어

    [myControl touchAt:CGPointMake(2.5, 2.5)];