Existe uma maneira de passar toques no iPhone?

Eu tenho vários UIButton s que eu uso para definir a ação atual ao tocar na área principal. Eu também gostaria de permitir que o usuário arraste o botão diretamente para a área principal e execute a mesma ação; essencialmente, os toquesBegan e toquesMoved devem ser passados ​​para a visualização principal ao tocar os UIButtons, mas também devem enviar a ação de pressionar o botão.

Neste momento, tenho o toque no interior para mudar o controle. A saída de arrasto chama a seção interna de retoque para definir o controle e, em seguida, chama a seção de toques iniciados para iniciar a operação de toque da área principal.

No entanto, neste ponto, os toques Moved e toquesEnded obviamente não estão sendo chamados, porque os toques se originaram no UIButton.

Existe uma maneira de ignorar metade dos toques para que eles sejam passados ​​para a área principal, mas também permitir que eu defina o controle primeiro?

Na documentação, procure por Objetos de Resposta e a Cadeia de Respostas

Você pode “compartilhar” toques entre objects encaminhando a retícula. Seu UIButton tem um respondedor / controlador que recebe os events UITouch, meu palpite é que, uma vez que tenha pré-formado sua interpretação da mensagem, ele retornará – o toque foi manipulado e descartado.

A Apple sugere algo assim (com base no tipo de toque, claro):

[self.nextResponder touchesBegan:touches withEvent:event];

Em vez de descartar o evento de toque, ele é transmitido.

UIButton Subclass:

MyButton.h

 #import  @interface MyButton : UIButton { } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event ; @end 

MyButton.m

 #import "MyButton.h" @implementation MyButton - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { printf("MyButton touch Began\n"); [self.nextResponder touchesBegan:touches withEvent:event]; } @end 

Eu sei que esta pergunta tem dois anos (e já respondi), mas mesmo assim …

Quando eu tentei isso sozinho, os toques foram encaminhados, mas os botões não se comportavam mais como botões. Eu também passei os toques ao longo de “super” e agora tudo está bem.

Então, para iniciantes que podem se deparar com isso, é assim que o código deve ser:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; [self.nextResponder touchesBegan:touches withEvent:event]; } 

Não há necessidade de subclassificar! Basta colocar isso no topo da sua implementação antes de qualquer outra coisa:

 #pragma mark PassTouch @interface UIButton (PassTouch) @end @implementation UIButton (PassTouch) - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; [self.nextResponder touchesBegan:touches withEvent:event]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesMoved:touches withEvent:event]; [self.nextResponder touchesMoved:touches withEvent:event]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesEnded:touches withEvent:event]; [self.nextResponder touchesEnded:touches withEvent:event]; } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesCancelled:touches withEvent:event]; [self.nextResponder touchesCancelled:touches withEvent:event]; } @end