UIView touchSnded Событие не вызывается при первом нажатии, но вызывается при повторном нажатии
У меня есть UIView
подкласс с именем "MyView". В ControllerA у него есть свойство, MyView *myView
и добавил его в self.view
, На myView
Есть несколько случайных подпредставлений, скользящих справа налево, и затем исчезающих. Что я хочу сделать, так это когда пользователь нажимает на одно из скользящих подпредставлений, идентифицирует это представление и нажимает другой контроллер.
В MyView.m я переопределил touchesBegan
, touchesEnded
, touchesCanceled
и добавьте NSLog в каждый метод. В touchesEnded
Методы, я использую приведенный ниже код для определения прослушиваемого подпредставления:
UITouch *touch = [touches anyObject];
CGPoint touchLoaction = [touch locationInView:self];
for (UIView *subview in self.subviews) {
if ([subview.layer.presentationLayer hitTest:touchLoaction]) {
if (_delegate && [_delegate respondsToSelector:@selector(canvas:didSelectView:)]) {
[_delegate canvas:self didSelectView:subview];
}
break;
}
}
Мои рабочие шаги:
Когда я нажимаю на одно подпредставление, журнал: началось, закончилось. А затем подтолкнул к контроллеру B.
Когда я возвращаюсь к controllerA и нажимаю на одно подпредставление, журнал выглядит так: начался, отменился и не перешел на controllerB, потому что не было вызвано touchesEnded.
Когда снова коснитесь подпредставления, журнал будет: начался, закончился, а затем был отправлен на контроллер B.
Я подозреваю, что причина была в толчке, поэтому я закомментировал "идентификационный" код в touchesEnded
Метод, теперь, когда я нажимаю на подпредставление, журнал всегда: начался, закончился.
Итак, мой вопрос, почему touchesEnded
метод не вызывается на шаге 2?
Я пытался использовать performSelector:afterDelay:
отложить толчок, но это не помогает. Когда я возвращаюсь и нажимаю на подпредставление, это всегда touchesCancelled
метод вызывается, а затем я снова нажмите, затем touchesEnded
позвонить
Кто-нибудь может мне с этим помочь? Заранее спасибо и наилучшие пожелания!
2 ответа
Проверьте, активировано ли распознавание жестов на каком-либо из задействованных контроллеров представления, и если это так, отключите его. Распознаватели имеют тенденцию отменять касания в некоторых случаях. Из вашего описания я понимаю, что вы все равно не используете распознаватели жестов.
Вместо использования touchesBegan, touchesEnded и touchesCanceled, почему бы вам не установить UIGestureRecognizers для каждого подпредставления? Сделав это, вы также можете перехватывать события, прежде чем они произойдут, реализуя методы UIGestureRecognizerDelegate для большей детализации.
- (void)viewDidLoad {
[super viewDidLoad];
// Add the delegate to the tap gesture recognizer
self.tapGestureRecognizer.delegate = self;
}
// Implement the UIGestureRecognizerDelegate method
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// Determine if the touch is inside the custom subview
if ([touch view] == self.customSubview){
// If it is, prevent all of the delegate's gesture recognizers
// from receiving the touch
return NO;
}
return YES;
}