UICollectionView только вызов didSelectItemAtIndexPath, если пользовательские двойные ответкители, не будет вызывать, когда пользовательские краны

У меня есть UICollectionView, размер которого зависит от размера экрана. Отображаемый UICollectionViewCells имеет тот же размер, что и collectionView. Каждая ячейка имеет UIImage, который является размером ячейки. В CollectionView включен пейджинг, поэтому по существу это полноэкранное слайд-шоу фотографий, которое пользователь может пронести.

Проблема заключается в том, что -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath вызывается только в том случае, если пользователь постукивает двумя пальцами по ячейке или долго нажимает одним пальцем, а затем отпускает. Кажется, что по умолчанию нет выбора одного нажатия. Я не внес никаких изменений в распознаватель жестов CollectionView, поэтому у меня возникли проблемы с поиском решения этой проблемы.

Ответ 1

Вы уверены, что не случайно переопределяете - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath? "Select" vs. "deselect" в прошлом сработал с завершением кода Xcode.

Ответ 2

У меня была такая же проблема, и оказалось, что в UIView, содержащем UICollectionView, был UITapGestureRecognizer, и он отвечал вместо этого.

Это объясняет, почему didSelectItemAtIndexPath работает только в том случае, если пользователь нажимает двумя пальцами или длинными нажатиями одним пальцем, потому что это не вызывает UITapGestureRecognizer.

Итак, проверьте все UITapGestureRecognizer, которые вы получили там, но не обязательно на UICollectionView, но он может быть на любом UIView, содержащем его.

Ответ 3

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

Вы хотите отключить взаимодействие пользователя с препятствующим представлением либо в NIB, либо в коде.

view.userInteractionEnabled = NO;

Ответ 4

Просто добавьте к уже разрешенному вопросу еще одну ситуацию, при которой жест привязки может не работать, поскольку это продолжало мучить меня.

Если вы вернетесь false в пределах UICollectionViewDelegate' collectionView:shouldHighlightItemAtIndexPath:, жест выделения не будет функционировать, а collectionView:didSelectItemAtIndexPath: не будет вызываться. Возвращаемое по умолчанию значение этого метода-делегата true, поэтому у вас не возникнет проблема, если вы не реализуете его намеренно.

Ответ 5

Я сам столкнулся с этой проблемой. Первоначально у меня были кнопки и ярлыки, затем я реорганизовал свой пользовательский интерфейс и превратил эти кнопки/метки в ячейки для UICollectionView.

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

Глупо и очевидно в ретроспективе, но мне потребовалось пару часов, чтобы понять, что я сделал.

Ответ 6

У меня была одна и та же проблема... Я был основным прикосновениемBegan в представлении CollectionCell, и это привело к тому, что didSelectItemAtIndexPath не срабатывал, когда я касался ячейки. Удалено переопределение и все сработало.

Ответ 7

Я столкнулся с этой проблемой в Swift 3 и xcode 8, у меня было представление и представление коллекции внутри этого. В представлении коллекции есть userInteractionEnabled для true, но он все еще не работает. Исправлена ​​эта проблема путем переопределения ifHighlightItemAt, у меня нет любая дополнительная/пользовательская реализация в этом методе, поэтому я не переопределял этот метод. После добавления нижеприведенного кода вызывается метод didSelectItem.

func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
        return true
    }

Ответ 8

Если вы используете только didselect:

self.collectionView.allowsMultipleSelection = false

Или удалите эту строку.

Ответ 10

Не забудьте добавить UICollectionViewDataSource, UICollectionViewDelegate в класс