Como “transferência” primeira resposta de um UIView para outro?
-
07-07-2019 - |
Pergunta
Eu tenho um UIView subclasse (CustomView
para os fins desta questão), que tem a sua própria manipulação de todos os eventos touches
(Começou, movido, terminou, Cancelado). Eu também tenho um UIButton
que é um irmão de CustomView
que se sobrepõe-lo.
Por exemplo, minha visão de hierarquia esta aparência:
- UIView (visão de Controller)
- CustomView com quadro (0, 0, 300, 300)
- UIButton com quadro (0, 0, 100, 50)
Gostaria que o CustomView a eventos captura de toque, uma vez que o usuário tenha arrastado para fora do UIButton. Através de registo de depuração, parece que o evento UIControlEventTouchDragExit
é o único a interceptação (embora não fogo até que o toque é de cerca de 100 pixels de distância do botão, mas isso não é importante para esta questão).
Idealmente, quando o evento de saída de arrastar é acionado, o botão seria parar de receber eventos de toque movimento, o CustomView iria receber um evento touchesBegan
(mesmo se eu precisar de falsificar um para mim de alguma forma), e todos os eventos futuros toque (touchesMoved
, etc ) seria enviado para o CustomView.
Eu tentei o seguinte e ele não tem qualquer efeito:
-(void)btnTouchDragExit:(id)sender
{
UIButton * btn = sender;
[btn resignFirstResponder];
[customView becomeFirstResponder];
}
Eu acho que o objeto UITouch
subjacente (que é consistente em todos os eventos de toque) não está sendo redirecionada para apontar para o CustomView. Como posso conseguir o efeito desejado?
Solução
Basta usar hitTest: withEvent: descobrir o que ver "deveria" estar a receber o evento, em seguida, encaminhar o evento para a visualização apropriada. Você pode ter que fazer um pouco de dança ao redor para eventos interceptar antes de irem para o botão, mas isso é o que hitTest: withEvent:. Foi feito para
Outras dicas
você tem que canBecomeFirstResponder
substituição para retornar SIM de outra forma becomeFirstResponder
não faz nada. Isso já é feito em UIControl
s, mas não em UIView
s