У меня есть UIView, к которому я добавил UITapGestureRecognizer. Я добавил UICollectionView в качестве подвида. Проблема в том, что UICollectionView использует UITapGestureRecognizers для перехвата нажатий на ячейки представления коллекции, а родительский UIView их перехватывает. Есть ли способ передать эти распознаватели, чтобы они обрабатывались как UIView, так и UICollectionView?
** Редактировать — добавить пример кода **
let mainView = UIView()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(foo))
mainView.addGestureRecognizer(tapGestureRecognizer)
let collectionView = UICollectionView(/*...*/)
collectionView.delegate = self
mainView.addSubview(collectionView)
func foo(_ gestureRecognizer: UIGestureRecognizer) {
// Will be called when I tap on mainView
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// Will NOT be called when I tap on collectionView's cells
}
Спасибо.
ты. означает, что вы хотите, чтобы ваш жест обрабатывался как из UIView, так и из UICollectionView?
@BrandonStillitano предоставил :)
@MukeshShakya Да
Вы хотите, чтобы ваша функция foo вызывалась только в том случае, если касание происходит из mainView, верно?
Включите взаимодействие с пользователем UICollectionView и проверьте
@MukeshShakya Нет. Если касание происходит из основного представления, за пределами коллекции, следует вызвать foo(). Если касание происходит в ячейке collectionView, то должны быть вызваны обе функции foo() и didSelectItemAt.
Если вы хотите, чтобы ваша функция жестов вызывалась при нажатии в ячейке, просто вызовите функцию, когда ячейка выбрана.
@MukeshShakya Я упростил структуру представлений для публикации этого вопроса, в моем проекте структура более сложная, а представление коллекции находится глубже в иерархии. Таким образом, сообщение collectionView о foo() не подходит. Но ответ, который вы предложили ниже, помог мне. Спасибо!
Вы можете просто вызвать функцию, которая может взаимодействовать с представлением, чтобы заставить его работать.





Вы можете добиться этого от UIGestureRecognizerDelegate. Назначьте делегата вашему жесту и используйте расширение ниже. Delegate ниже позволяет жесту получать прикосновение только при прикосновении снаружи от collectionView.
extension SharePathViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
let point = touch.location(in: view)
return !collectionView.frame.contains(point)
}
}
Если вы хотите, чтобы ваша функция жестов вызывалась при нажатии в ячейке, просто вызовите функцию, когда ячейка выбрана.
Приведите пример кода.