2013-06-02 4 views
27

У меня есть UIScrollView, к которому я добавил один кран жест распознаватель, чтобы показать/скрыть некоторые UI накладку с помощью:ScrollView жест распознаватель едят все события прикосновения

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
[scrollView addGestureRecognizer:singleTap]; 

и:

- (void)handleTap:(UITapGestureRecognizer *)sender { 
    // report click to UI changer 
} 

Я добавил a easy table view в нижней части UIScrollView. Все работает правильно (прокрутка как по горизонтали, так и по вертикали), но проблема в том, что краны распознаются только распознавателем жестов (см. Выше), но не простым представлением таблицы. Если я удаляю строку, которая регистрирует слушателя жестов, все работает нормально, в представлении таблицы видны нажатия на себя.

Это как если бы функция распознавания жестов «ест» события нажатия на табличном представлении и не распространяется на них вниз.

Любая помощь с учетом

ответ

61

Это должно решить вашу проблему.
Detect touch event on UIScrollView AND on UIView's components [which is placed inside UIScrollView]
Идея состоит в том, чтобы сообщить распознавателю жестов не проглотить события касания. Для этого вам нужно установить свойство cancelsTouchesInView singleTap в NO, что по умолчанию равно YES.

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
singleTap.cancelsTouchesInView = NO; 
[scrollView addGestureRecognizer:singleTap]; 
+1

Это сделало трюк :) –

+2

У меня есть аналогичная проблема ([мой вопрос] (http://stackoverflow.com/questions/33105678/in-ios-button-tapping-not-fired-when-keyboard-is- видимый)), но решение для меня не работает. Иногда событие увольняется, иногда нет. – new2ios

+1

, что один является окончательным решением.thanks zambrey –

5

Вы можете установить, какие объекты должны быть включены/исключены для касаний.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {    
    if (touch.view == [self view]) { 
     return YES; 
    } 
    return NO; 
} 
5

Я думаю, что причина в том, что User Interaction Enabled установлен в false для UIImageView. Вы должны установить его на истинный, чтобы включить в него нажав

2

Благодарности @zambrey

Swift 2.2+ Версия:

scrollView.delegate = self 

let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed)) 
allowMultipleTouches.numberOfTapsRequired = 1 
allowMultipleTouches.cancelsTouchesInView = false 

scrollView.addGestureRecognizer(allowMultipleTouches) 

Если ваш взгляд прокрутки в раскадровке, не забудьте выведите Outlet в контроллер вида. В этом примере scrollView является выходом UIScrollView.

1

TapGestures работал для меня. С другой стороны, проведите пальцем по экрану, мне пришлось отключить прокрутку, и это сработало.

 swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:))) 
    swipeLeftGesture.direction = .left 
    scrollView.addGestureRecognizer(swipeLeftGesture) 

    swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:))) 
    scrollView.addGestureRecognizer(swipeRightGesture) 

    scrollView.isScrollEnabled = false 
5

Swift 3,0

let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) 
singleTap.cancelsTouchesInView = false 
singleTap.numberOfTapsRequired = 1 
scrollView.addGestureRecognizer(singleTap) 

И метод выбора быть.

func handleTap(_ recognizer: UITapGestureRecognizer) { 
    // Perform operation 
} 
+0

Идеальное решение! –

1

Вы можете записывать любые жесты в UIscrollView. Убедитесь, что вы также обрабатываете некоторые свойства по умолчанию, а также устанавливаете для параметра cancelsTouchesInView значение false, по умолчанию оно истинно. Также укажите тег nos для ваших подходов, чтобы различать в селекторах. & также позволяют использовать их взаимодействие с пользователем.

пусть водопроводная = UITapGestureRecognizer (цель: самость, действие:

селектор (didTapByUser (_ :)))

1

Это работает для меня в Swift 3/Xcode 8

self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **) 
    self.scrollView.canCancelContentTouches = false 

Удачи вам!

+0

Вместо того, чтобы оставлять эту информацию в комментарии, пожалуйста, отредактируйте свой ответ и добавьте его прямо там, а затем удалите комментарий. Вы также можете уловить возможность исправить отступ (форматирование кода с помощью Markdown требует 4 пробела, но у вас есть 8, что приводит к ненужному дополнительному уровню отступов). Спасибо! –

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