Подтвердить что ты не робот

ScrollView распознаватель жестов ест все события касания

У меня есть UIScrollView, к которому я добавил один распознаватель жестов, чтобы показать/скрыть некоторые наложения пользовательского интерфейса, используя:

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

и

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

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

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

Любая помощь приветствуется

4b9b3361

Ответ 1

Это должно решить вашу проблему.
Обнаружение события касания на UIScrollView и на компонентах UIView [который размещен внутри UIScrollView]
Идея состоит в том, чтобы сообщить распознавателю жестов не проглатывать события касания. Для этого вам нужно установить свойство singleTap cancelsTouchesInView на NO, которое по умолчанию YES.

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

Ответ 2

Swift 3.0

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

И метод выбора будет похож.

@objc func handleTap(_ recognizer: UITapGestureRecognizer) {
  // Perform operation
}

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Удачи!

Ответ 6

Спасибо @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.

Ответ 7

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

Ответ 8

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

let tap = UITapGestureRecognizer (target: self, action:

Селектор (didTapByUser (_)))

Ответ 9

Swift 4.0

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

Метод выбора:

@objc func handleTap(_ recognizer: UITapGestureRecognizer) {
    print("Tapped")
}

Не забудьте метку @objc