ScrollView распознаватель жестов ест все события касания
У меня есть UIScrollView
, к которому я добавил один распознаватель жестов, чтобы показать/скрыть некоторые наложения пользовательского интерфейса, используя:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[scrollView addGestureRecognizer:singleTap];
и
- (void)handleTap:(UITapGestureRecognizer *)sender {
// report click to UI changer
}
Я добавил простой вид таблицы в нижней части UIScrollView
. Все работает правильно (прокрутка как по горизонтали, так и по вертикали), но проблема в том, что краны распознаются только распознавателем жестов (см. Выше), но не простым представлением таблицы.
Если я удаляю строку, которая регистрирует прослушиватель жестов, все работает отлично, представление таблицы замечает ответные нажатия на себя.
Как будто функция распознавания жестов "съедает" события нажатия на табличном представлении и не распространяется на них вниз.
Любая помощь приветствуется
Ответы
Ответ 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