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 UIViewque é derivado de, UIResponderportanto, está pronto para lidar com eventos de toque. Você vai querer fornecer os touchesBegan, touchesMovede touchesEndedmé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 canBecomeFirstRespondere retorne SIM para indicar que a visualização pode se tornar o foco dos eventos de toque (o padrão é NÃO).
Defina a userInteractionEnabledpropriedade como SIM. O padrão para UIViewsé SIM, mas para UIImageViewsNÃO, então você deve ativá-lo explicitamente.
Se você deseja responder a eventos multitoque (ou seja, apertar, zoom, etc), você deve definir multipleTouchEnabledcomo SIM.
userInteractionEnabledcomo 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 UILablecom parâmetros muito semelhantes que estou definindo para ele. sob IOS 5.1.
Já fiz o seguinte:
UIImageView.UIImageViewcriar subclasses , mas não ajudou em nada.Anexando algum código abaixo, neste código eu inicializo a UIImageViewe 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 UIImageViewsubvisão.
Dentro desse método, teste se algum dos UITouchtoques está dentro dos limites da UIImageViewinstância (digamos que seja chamado imageView).
Ou seja, o CGPointelemento faz [touch locationInView]interseção com o CGRectelemento [imageView bounds]? Verifique a função CGRectContainsPointpara 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