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;
    }
}

Мои рабочие шаги:

  1. Когда я нажимаю на одно подпредставление, журнал: началось, закончилось. А затем подтолкнул к контроллеру B.

  2. Когда я возвращаюсь к controllerA и нажимаю на одно подпредставление, журнал выглядит так: начался, отменился и не перешел на controllerB, потому что не было вызвано touchesEnded.

  3. Когда снова коснитесь подпредставления, журнал будет: начался, закончился, а затем был отправлен на контроллер 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;

}
Другие вопросы по тегам