UITapGestureRecognizer на UIView и неговият Subview отговарят заедно, когато Subview бъде докоснат

UITapGestureRecognizer се прилага както към UIImageView, така и към неговия подизглед (UITextView). Въпреки това, когато докосна подизглед, приемникът става подизглед и неговия родителски изглед (т.е. UIImageView + UITextView). Трябва обаче да е само подизглед, защото това беше този, който докоснах. Предполагах, че вложените жестове ще реагират първи, но очевидно родителят получава първото докосване и след това отива към детето.

И така, има различни решения за различни сценарии (не са подобни на моя, а по-скоро бутони в конфликт на изглед на превъртане). Как мога лесно да коригирам проблема си без възможно подкласиране и за поддръжка на 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
Проблемът ми беше, че жестът с докосване винаги отиваше в суперизгледа и пропускаше подизгледа. Обръщането на флага на ДА (или вярно в swift) спаси живота ми - person aquajach; 30.06.2015

трябва да внедрите методите на делегиране на UIGestureRecognizer и да приложите правилната политика към жеста, когато се разпознават множество жестове

person Manu    schedule 25.10.2013