Como adiciono um evento de toque a um UIView?
Eu tento:
UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, nextY)] autorelease];
[headerView addTarget:self action:@selector(myEvent:) forControlEvents:UIControlEventTouchDown];
// ERROR MESSAGE: UIView may not respond to '-addTarget:action:forControlEvents:'
Não quero criar uma subclasse e substituir
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
Respostas:
No iOS 3.2 e superior, você pode usar os reconhecedores de gestos. Por exemplo, é assim que você lida com um evento de toque:
Há um monte de gestos embutidos também. Confira os documentos para manipulação de eventos do iOS e
UIGestureRecognizer
. Eu também tenho um monte de código de exemplo no github que pode ajudar.fonte
CGPoint
representa a localização da torneira na super visão da vista tocada. Você pode usar este ponto para mover a vista tocada (ou uma visão de irmão) para o local tocado. Isso é mais útil no manipuladorUIPanGestureRecognizer
para arrastar a exibição pela tela.Reconhecedores de gestos
Há vários eventos de toque comum (ou gestos) dos quais você pode ser notificado quando adiciona um Reconhecimento de gestos à sua exibição. Os seguintes tipos de gesto são suportados por padrão:
UITapGestureRecognizer
Toque em (toque brevemente na tela uma ou mais vezes)UILongPressGestureRecognizer
Toque longo (tocando na tela por um longo tempo)UIPanGestureRecognizer
Pan (movendo o dedo pela tela)UISwipeGestureRecognizer
Deslize (movendo o dedo rapidamente)UIPinchGestureRecognizer
Aperte (movendo dois dedos juntos ou separados - geralmente para aumentar o zoom)UIRotationGestureRecognizer
Girar (movendo dois dedos em uma direção circular)Além desses, você também pode criar seu próprio reconhecedor de gestos personalizado.
Adicionando um gesto no Interface Builder
Arraste um reconhecedor de gestos da biblioteca de objetos para a sua exibição.
Arraste o controle do gesto no Esboço do documento para o código do View Controller para criar uma saída e uma ação.
Isso deve ser definido por padrão, mas também verifique se a Ação do Usuário Ativada está definida como true para sua visualização.
Adicionando um gesto programaticamente
Para adicionar um gesto programaticamente, você (1) cria um reconhecedor de gestos, (2) o adiciona a uma visualização e (3) cria um método chamado quando o gesto é reconhecido.
Notas
sender
parâmetro é opcional. Se você não precisar de uma referência ao gesto, pode deixar de fora. Se você fizer isso, remova o(sender:)
nome do método após a ação.handleTap
método foi arbitrária. Nomeie como quiser .action: #selector(someMethodName(sender:))
Mais exemplos
Você pode estudar os reconhecedores de gestos que adicionei a essas visualizações para ver como eles funcionam.
Aqui está o código para esse projeto:
Notas
fonte
UIView
é preciso também acrescentar:self.isUserInteractionEnabled = true;
Eu acho que você pode simplesmente usar
Quero dizer headerView se estende de UIControl.
fonte
UITapGestureRecognizer
não é uma substituição deUIControlEventTouchDown
. ATap
geralmente compõeUIControlEventTouchDown
eUIControlEventTouchUpInside
.UIView
não é aUIControl
e, portanto, não tem acessoaddTarget:action:forControlEvents:
.Swift 3 e Swift 4
Usar
fonte
Com base na resposta aceita, você pode definir uma macro:
Essa macro usa o ARC, então não há
release
chamada.Exemplo de uso de macro:
fonte
Você pode conseguir isso adicionando o Gesture Recogniser no seu código.
Etapa 1: ViewController.m:
Etapa 2: ViewController.m:
NOTA: aqui o seuView no meu caso foi
@property (strong, nonatomic) IBOutlet UIView *localView;
EDIT: * localView é a caixa branca no Main.storyboard a partir de baixo
fonte
No Swift 4.2 e no Xcode 10
Use UITapGestureRecognizer para adicionar evento de toque
Se você deseja usar o SharedClass
Eu tenho três visualizações no meu ViewController chamado view1, view2 e view3.
fonte
Aqui está uma versão Swift:
fonte
BlockTap
?Swift 3:
fonte
Parece bastante simples nos dias de hoje. Esta é a versão Swift.
fonte
Aqui está o iOS tapgesture; Primeiro, você precisa criar uma ação para o GestureRecognizer depois de escrever o código abaixo na ação, como mostrado abaixo
fonte
Outra maneira é adicionar um botão transparente à visualização
E então, manipule o clique:
fonte
Crie um reconhecedor de gestos (subclasse) que implementará eventos de toque, como
touchesBegan
. Você pode adicioná-lo à exibição depois disso.Dessa forma, você usará a composição em vez de subclassificar (que foi a solicitação).
fonte
Por que vocês não experimentam o SSEventListener ?
Você não precisa criar nenhum reconhecedor de gestos e separar sua lógica para outro método.
SSEventListener
suporta a configuração de blocos de ouvinte em uma exibição para ouvir gestos de toque único, gesto de toque duplo e gesto de toque N, se desejar, e pressione e segure. A configuração de um único ouvinte de gesto de toque se torna assim:[view ss_addTapViewEventListener:^(UITapGestureRecognizer *recognizer) { ... } numberOfTapsRequired:1];
fonte
Objetivo-C:
Rápido:
A pergunta pergunta:
Não está solicitando um evento de toque .
Especificamente, o OP quer implementar
UIControlEventTouchDown
Mudar o
UIView
queUIControl
é a resposta certa aqui porqueGesture Recognisers
não sei nada sobre.touchDown
,.touchUpInside
,.touchUpOutside
etc.Além disso, o UIControl herda do UIView, para que você não perca nenhuma funcionalidade.
Se tudo o que você deseja é um toque, é possível usar o Reconhecedor de gestos. Mas se você deseja um controle mais preciso, como esta pergunta pede, precisará do UIControl.
https://developer.apple.com/documentation/uikit/uicontrol?language=objc https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc
fonte