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

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

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

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

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

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

Ответ 1

Мне удалось исправить эту проблему, используя UITapGestureRecognizer в UICollectionView backgroundView. Это в Swift, но идея понятна:

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
}

Ответ 2

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

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
}

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

Ответ 3

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

Ответ 4

Это работало для меня на Swift 2.3

Шаг 1: Внедрение протокола UIGestureRecognizerDelegate

Шаг 2: Установите UITapGestureRecognizer в UICollectionView backgroundView

Шаг 3: Обращайтесь к тому, что делать при нажатии на ручку. Функция тэга

class namScreenVcc: UICollectionViewController, UIViewControllerTransitioningDelegate, UIGestureRecognizerDelegate
{
    override func viewDidLoad()
    {
        super.viewDidLoad()

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
        tapGestureRecognizer.delegate = self

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

    func handleTap(recognizer: UITapGestureRecognizer)
    {
        // Handle the tap gesture
    }
}

Ответ 5

немного "косметики" для 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
}

Ответ 6

Основано на ответе Пола Попиля, но в Задаче C

Чтобы настроить распознаватель жестов:

//The setup code (in viewDidLoad in your view controller)
UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self
                                        action:@selector(handleSingleTap:)];
[self.collectionView addGestureRecognizer:singleFingerTap];

И обработать кран и распознать, касается ли он ячейки или пространства, не покрытого ячейкой

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
    CGPoint location = [recognizer locationInView:[recognizer.view superview]];
    NSIndexPath* indexPath = [self.collectionView indexPathForItemAtPoint:location];
    if (!indexPath)
    {
        //Handle your selection of the white space in the collection view here.  Your code may vary.
        [self setSelected:YES];
    } else {
        //Handle selection of individual cell here
        [self collectionView:self.collectionView didSelectItemAtIndexPath:indexPath];
    }
}