Как получать прикосновения к UICollectionView в пустом пространстве вокруг всех ячеек

У меня есть UICollectionView, в котором есть разные элементы. Когда я нажимаю на элемент, я использую:

 -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

чтобы выяснить, что было затронуто, а затем в основном установите альфа этого представления в 0, чтобы скрыть его. Это все работает отлично. Теперь я хотел бы, чтобы вы нажали на пустое пространство, окружающее все UICollectionViewCell, после чего все виды снова появятся. У меня возникают проблемы с поиском метода, который позволит мне узнать, когда было затронуто белое пространство вокруг клеток. Есть ли хороший способ сделать это? Я попытался настроить распознаватель жестов, но когда я это сделал, мой метод

 -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

не вызывается. Есть ли способ просто реализовать распознаватель жестов и оттуда определить, была ли нажата ячейка, и если да, то скрыть эту ячейку, иначе показать все скрытые ячейки? Спасибо.

12 голосов | спросил Blane Townsend 11 J000000Friday14 2014, 20:00:37

4 ответа


0

Мне удалось решить эту проблему с помощью UITapGestureRecognizer в UICollectionView backgroundView. Это на Свифте, но идея ясна:

self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTap:")
self.tapGestureRecognizer.delegate = self

self.collectionView.backgroundView = UIView(frame:self.collectionView.bounds)
self.collectionView.backgroundView!.addGestureRecognizer(tapGestureRecognizer)

И обратный вызов:

func handleTap(recognizer: UITapGestureRecognizer) {
    // Handle the tap gesture
}
ответил Antoine 14 Jpm1000000pmWed, 14 Jan 2015 17:14:31 +030015 2015, 17:14:31
0

Я столкнулся с похожим сценарием в своем проекте и решил его, выполнив следующие действия:

let tapGestureRecogniser = UITapGestureRecognizer(target: self, action: #selector(handleTapEmptySpaceGesture))
tapGestureRecogniser.delegate = self
collectionView.addGestureRecognizer(tapGestureRecogniser)

Реализуйте протокол UIGestureRecognizerDelegate

Затем реализуйте в протоколе следующую функцию:

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
    // only handle tapping empty space (i.e. not a cell)
    let point = gestureRecognizer.locationInView(collectionView)
    let indexPath = collectionView.indexPathForItemAtPoint(point)
    return indexPath == nil
}

По сути, если щелчок по ячейке, распознаватель жестов не запускается, что позволяет запускать обычные делегаты выбора /отмены выбора. В противном случае, если он находится на пустом месте, ваш распознаватель обрабатывает кран и запускает его обработчик.

ответил Paul Popiel 26 Maypm16 2016, 19:54:05
0

Метод делегата didSelectItem будет вызываться только тогда, когда пользователь выбирает collectionViewCell. Расстояние между ячейками может варьироваться в зависимости от размера каждой ячейки, вы можете указать только минимальный интервал. Чтобы получить прикосновения, оставьте дополнительный вид в качестве фонового вида, изменив его индекс, добавив к нему обнаружение прикосновения. Надеюсь, что это поможет вам. :)

ответил Santhosh 12 J000000Saturday14 2014, 12:03:45
0

немного "косметики" для Swift 4.2: (спасибо другим авторам выше .. :))

// TOUCHES in empty space:

private func addGestureRecognizers(){
    let tapGestureRecogniser = UITapGestureRecognizer(target: self, action: #selector(handleTapEmptySpaceGesture))
    tapGestureRecogniser.delegate = self
    collectionView.addGestureRecognizer(tapGestureRecogniser)
}


@objc func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    // only handle tapping empty space (i.e. not a cell)
    let point = gestureRecognizer.location(in: collectionView)
    let indexPath = collectionView.indexPathForItem(at: point)
    return indexPath == nil
}
ответил ingconti 30 SunEurope/Moscow2018-12-30T16:00:51+03:00Europe/Moscow12bEurope/MoscowSun, 30 Dec 2018 16:00:51 +0300 2018, 16:00:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132