2017-02-18 4 views
0

Я установил UITapGestureRecognizer на представление. Только определенные области в представлении должны инициировать поведение представления. Я делаю это, проверяя, находится ли точное местоположение касания в реальных действительных областях в представлении. В тех случаях, когда касание не в этих областях, я хотел бы, чтобы кран распространялся вверх в иерархии представлений.Сделать UITapGestureRecognizer не использовать краны, которые не имеют отношения к виду

Я попытался использовать делегата жестов: shouldReceive touch и проверить там, если касание имеет отношение к виду, но я не могу выполнить действие там, так как оно срабатывает при касании, а не при нажатии. Я мог бы просто выполнить тест релевантности в shouldReceive, и только если вызываемый обработчик действия вызова вызван, выполните действие, но я нахожу его неудобным. Есть ли более элегантный способ сказать iOS, что мой распознаватель жестов решил не потреблять краны?

+0

Вы можете поделиться некоторым связанным кодом? Являются ли _специфические области_, ​​где должен быть активирован жест нажатия, вид другого типа по сравнению с другими? – ystack

+0

На практике представление, над которым я работаю, это UITextView с атрибутомString, где только его части отмечены пользовательским действием. Поэтому в своем действии я сначала проверяю, коснется ли какой-либо из этих областей, а если нет, ничего не делайте (желательно, не используйте краны). – jazzgil

+0

Woah! Если бы были задействованы множественные представления с использованием 'gestureRecognizer: shouldReceiveRouch', это был бы правильный путь. Но с атрибутами строк, для нетривиальных прецедентов, вы должны полагаться на Text Kit. Не смотря на какой-либо код, я могу только предложить изучить этот конкретный ответ, будет полезно: http://stackoverflow.com/a/28519273/3339346 – ystack

ответ

0

Основываясь на нашем обсуждении, вы можете оценить используя комбинацию if-else проверки в attributedString касание обработчику & gestureRecognizer:shouldReceiveTouch:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 

    if ([touch.view isDescendantOfView:interestingView]) { 
     return NO; 
    } 
    return YES;  
} 

Надеюсь, что это помогает.
Если нет, то снова, повторюсь, было бы лучше, если бы вы могли поделиться некоторым связанным кодом.

+0

Как я уже объяснял - это то, что у меня уже есть, но найти громоздку и неудобно разделить тестовую часть и инициирование действия. Я ищу решение внутри обработчика действий жестов самого крана. – jazzgil

+0

Да, я знаю, что _^это может стать уродливым. Может быть, вы могли бы подумать об отрыве своих взглядов от иерархии. Не создавайте иерархию представлений _parent-child_ между представлениями, которые должны обрабатывать жесты по-разному. ИЛИ, имеет обработку жестов _router_, которая определяет местоположение жестов и вызывает независимых обработчиков жестов, у каждого из которых есть _no_ зависимость, вообще-то, на вид для любых данных. – ystack

Смежные вопросы