UITapGestureRecognizer на UIView и его подпредставление отвечают вместе при касании подпредставления

UITapGestureRecognizer применяется как к UIImageView, так и к его подпредставлению (UITextView). Однако, когда я нажимаю на subview, получатель становится subview и его родительским представлением (т.е. UIImageView + UITextView). Однако это должно быть только subview, потому что я выбрал именно его. Я предполагал, что вложенные жесты будут реагировать первыми, но, очевидно, родитель получает удар кулаком, а затем он переходит к дочернему элементу.

Итак, существуют разные решения для различных сценариев (не похожие на мой, а скорее кнопки внутри конфликта просмотра прокрутки). Как я могу легко исправить свою проблему без возможного подкласса и для поддержки iOS 6+? Я попробовал отложить касание при запуске для UIGestureRecognizer на UIImageView и попытался установить cancelsTouchesInView на NO - все безуспешно.


person Vad    schedule 25.10.2013    source источник
comment
пожалуйста, поделитесь кодом. Как добавить жесты?   -  person Kunal Balani    schedule 25.10.2013


Ответы (3)


Попробуйте следующий код:

согласовать ‹UIGestureRecognizerDelegate> со своим классом.

установить yourGesture.delegate = self;

затем добавьте этот метод делегата:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    // return YES (the default) to allow the gesture recognizer to examine the touch object, NO to prevent the gesture recognizer from seeing this touch object.
    if([touch.view isKindOfClass: [UITextView class]] == YES)] {
        return YES;
    }
    else {
        return NO;
    }
}

Надеюсь, это решит вашу проблему. Наслаждайтесь кодированием .. !!!!

person Sahil Mahajan    schedule 26.10.2013
comment
несколько комментариев о полной картине shouldReceiveTouch: она была обработана раньше всего (распознавание жестов, событие касания и т. д.), и сначала будет вызываться подпредставление. - person lbsweek; 14.09.2018

Это именно то, что он должен делать. Иерархия представлений похожа на древовидную структуру, и ее обход во время сенсорного жеста начинается с корневого узла. Очень вероятно, что ваше родительское представление сначала получит жест, а затем его дочерние представления. Обход пропускает узлы, для которых

userInteractionEnabled = НЕТ.

поскольку у вас нет кода, я не могу помочь вам поиграть с этим флагом. Более общее решение - всегда устанавливать жест только для вашего parentView, а в делегатах жеста проверять координаты, если он принадлежит какому-либо из подпредставлений, и если да, то вызывать свой метод жеста для вашего подпредставления. Не чистый подход, но работает. !!

person Kunal Balani    schedule 25.10.2013
comment
Моя проблема заключалась в том, что сенсорный жест всегда переходил в супервизор и пропускал субпредставление. Повернув флаг на ДА (или быстро вернувшись), я спас мне жизнь - person aquajach; 30.06.2015

вы должны реализовать методы делегата UIGestureRecognizer и применить правильную политику к жесту, когда распознается несколько жестов

person Manu    schedule 25.10.2013