Coloquei uma imagem (UIImageView) na barra de navegação. Agora quero detectar o evento de toque e controlar o evento. Você poderia me dizer como posso fazer isso?
Obrigado.
Coloquei uma imagem (UIImageView) na barra de navegação. Agora quero detectar o evento de toque e controlar o evento. Você poderia me dizer como posso fazer isso?
Obrigado.
Respostas:
Em termos práticos, não faça isso.
Em vez disso, adicione um botão com estilo personalizado (sem gráficos de botão, a menos que você especifique imagens) sobre o UIImageView. Em seguida, anexe quaisquer métodos que você deseja chamar para isso.
Você pode usar essa técnica para muitos casos em que realmente deseja que alguma área da tela atue como um botão em vez de mexer com o toque.
A UIImageView
é derivado de a UIView
que é derivado de, UIResponder
portanto, está pronto para lidar com eventos de toque. Você vai querer fornecer os touchesBegan
, touchesMoved
e touchesEnded
métodos e eles vão obter chamado se o usuário toca a imagem. Se tudo o que você deseja é um evento de toque, é mais fácil apenas usar um botão personalizado com a imagem definida como a imagem do botão. Mas se você quiser um controle de grão mais fino sobre torneiras, movimentos, etc., este é o caminho a percorrer.
Você também vai querer ver mais algumas coisas:
Substitua canBecomeFirstResponder
e retorne SIM para indicar que a visualização pode se tornar o foco dos eventos de toque (o padrão é NÃO).
Defina a userInteractionEnabled
propriedade como SIM. O padrão para UIViews
é SIM, mas para UIImageViews
NÃO, então você deve ativá-lo explicitamente.
Se você deseja responder a eventos multitoque (ou seja, apertar, zoom, etc), você deve definir multipleTouchEnabled
como SIM.
userInteractionEnabled
como SIM na minha visualização dos pais. Consulte stackoverflow.com/questions/5887305/…
Para adicionar um evento de toque a um UIImageView use o seguinte em seu .m
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];
[myImageView setUserInteractionEnabled:YES];
[myImageView addGestureRecognizer:newTap];
-(void)myTapMethod{
// treat image tap
}
espero que ajude.
Você também pode adicionar um UIGestureRecognizer. Ele não exige que você adicione um elemento adicional em sua hierarquia de visualização, mas ainda fornece a você todo o código bem escrito para lidar com eventos de toque com uma interface bastante simples:
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
[imgView_ addGestureRecognizer:swipeRight];
[swipeRight release];
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[imgView_ addGestureRecognizer:swipeLeft];
[swipeLeft release];
Estive em diferentes tópicos nas últimas horas tentando encontrar uma solução para o meu problema, sem sucesso. Vejo que muitos desenvolvedores compartilham esse problema e acho que as pessoas aqui sabem disso. Tenho várias imagens dentro de um UIScrollView
, tentando obter eventos de toque nelas.
não obtendo eventos de um UIImangeView
, mas recebo um evento de um semelhante UILable
com parâmetros muito semelhantes que estou definindo para ele. sob IOS 5.1.
Já fiz o seguinte:
UIImageView
.UIImageView
criar subclasses , mas não ajudou em nada.Anexando algum código abaixo, neste código eu inicializo a UIImageView
e UILabel
, o rótulo funciona bem em termos de eventos de disparo. Tentei evitar códigos irrelevantes. Obrigado pessoal Ilan
UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image=img;
single_view.layer.zPosition=4;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];
self.myScrollView.userInteractionEnabled=YES;
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor=[UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition=4;
E o método que trata o evento:
- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
NSLog(@"Touch event on view: %@",[tappedView class]);
}
Como disse, a torneira de etiqueta é recebida.
Em vez de fazer um UIImageView tocável e colocá-lo na barra de navegação, você deve apenas criar um UIBarButtonItem, que pode ser feito a partir de um UIImageView.
Primeiro faça a visualização da imagem:
UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];
Em seguida, faça o item barbutton fora de sua visualização de imagem:
UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];
Em seguida, adicione o item do botão da barra à sua barra de navegação:
self.navigationItem.rightBarButtonItem = yourBarButtonItem;
Lembre-se de que esse código vai para o controlador de visualização, que está dentro de um array de controlador de visualização do controlador de navegação. Então, basicamente, este "item de botão da barra de aparência de imagem tocável" só aparecerá na barra de navegação quando este controlador de visualização estiver sendo mostrado. Quando você pressiona outro controlador de visualização, este item do botão da barra de navegação irá desaparecer ~
O que você pode querer fazer é substituir o touchesBegan:withEvent:
método da UIView
(ou subclasse) que contém sua UIImageView
subvisão.
Dentro desse método, teste se algum dos UITouch
toques está dentro dos limites da UIImageView
instância (digamos que seja chamado imageView
).
Ou seja, o CGPoint
elemento faz [touch locationInView]
interseção com o CGRect
elemento [imageView bounds]
? Verifique a função CGRectContainsPoint
para executar este teste.
Para aqueles que procuram uma solução Swift 4 para esta resposta. Você pode usar o seguinte para detectar um evento de toque em um UIImageView.
let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true
Você precisará definir seu seletor da seguinte maneira:
@objc func imageViewTapped() {
// Image has been tapped
}
Adicione um gesto nessa imagem view.add nessa visualização, então ele detectaria um gesto na imagem também. Você pode tentar com o método delegado de evento de toque, então, nesse caso, ele também pode estar detectando. obrigado