Я UICollectionView
впервые использую приложение для iPad. Я установил UICollectionView
, что его размер и размер ячейки одинаковы, что означает, что ячейка отображается только один раз.
Проблема: теперь, когда пользователь прокручивает UICollectionView, мне нужно знать, какая ячейка видна, мне нужно обновлять другие элементы пользовательского интерфейса при изменении. Я не нашел для этого метода делегата. Как я могу этого добиться?
Код:
[self.mainImageCollection setTag:MAIN_IMAGE_COLLECTION_VIEW];
[self.mainImageCollection registerClass:[InspirationMainImageCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.mainImageFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.mainImageFlowLayout setMinimumInteritemSpacing:0.0f];
[self.mainImageFlowLayout setMinimumLineSpacing:0.0f];
self.mainImageFlowLayout.minimumLineSpacing = 0;
[self.mainImageCollection setPagingEnabled:YES];
[self.mainImageCollection setShowsHorizontalScrollIndicator:NO];
[self.mainImageCollection setCollectionViewLayout:self.mainImageFlowLayout];
Что я пробовал:
Как UICollectionView
соответствует UIScrollView
, я получил, когда пользовательская прокрутка заканчивается UIScrollViewDelegate
методом
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
Но внутри функции выше, как я могу получить текущий видимый индекс ячейки UICollectionView
???
ios
objective-c
ipad
uicollectionview
Ирфан ДАТСКИЙ
источник
источник
Ответы:
Метод [collectionView visibleCells] дает вам весь массив visibleCells, который вы хотите. Используйте его, когда хотите получить
Обновление до Swift 5:
источник
scrollViewDidScroll:
делегата обеспечивает обновления представления прокрутки всякий раз, когда заканчивается прокрутка (и, вероятно, здесь лучше). В отличие отscrollViewDidEndDecelerating:
метода делегата, который вызывается только тогда, когда представление прокрутки « останавливается [от большой прокрутки] » (см. Заголовок UIScrollView)...DidScroll
много раз, даже во время короткой прокрутки. Может быть, а может и нет, в зависимости от того, что человек хочет делать.indexPathsForVisibleItems
может работать в большинстве ситуаций, но иногда он возвращает массив с более чем одним индексным путем, и может быть сложно определить тот, который вам нужен. В таких ситуациях вы можете сделать что-то вроде этого:Это особенно хорошо работает, когда каждый элемент в вашем представлении коллекции занимает весь экран.
Свифт версия
источник
visibleIndexPath
иногда будет ноль, Итакif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
Swift 5 :
Рабочие ответы, объединенные в Swift 2.2:
источник
Для полноты картины это метод, который в итоге сработал для меня. Это была комбинация методов @Anthony & @ iAn.
источник
Вероятно, лучше всего будет использовать методы UICollectionViewDelegate: (Swift 3)
источник
didEndDisplaying
документации: сообщает делегату, что указанная ячейка была удалена из представления коллекции. Используйте этот метод, чтобы определить, когда ячейка удаляется из представления коллекции, в отличие от мониторинга самого представления, чтобы увидеть, когда оно исчезнет. Так что я не думаю, чтоdidEndDisplaying
вызывается при отображении ячейки.Просто хочу добавить для других: по какой-то причине я не получил ячейку, которая была видна пользователю, когда я прокручивал предыдущую ячейку в collectionView с помощью pagingEnabled.
Поэтому я вставляю код в dispatch_async, чтобы придать ему немного «воздуха», и у меня это работает.
источник
DispatchQueue.main.async {
когда вызов инициируется чем-то вродеfunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
willDisplay cell
как указано выше. Я думаю, что проблема где-то в UIKit в моем случае действительно такая же, как и этот ответ.источник
Swift 3.0
Самое простое решение, которое даст вам indexPath для видимых ячеек.
вернет массив indexpath.
Просто возьмите первый объект из такого массива.
Думаю, он должен работать и с Objective-C.
источник
UICollectionView текущий видимый индекс ячейки: Swift 3
источник
преобразование ответа @ Anthony в Swift 3.0 отлично сработало для меня:
источник
Вы можете использовать
scrollViewDidEndDecelerating
: для этогоисточник
Это старый вопрос, но в моем случае ...
источник
Также проверьте этот фрагмент
источник
В этом потоке так много решений, которые отлично работают, если ячейка занимает полноэкранный режим, но они используют границы представления коллекции и средние точки видимого прямоугольника. Однако есть простое решение этой проблемы.
таким образом вы можете получить indexPath видимой ячейки. Я добавил DispatchQueue, потому что, когда вы проводите пальцем быстрее и если на короткое время отображается следующая ячейка, то без dispactchQueue вы получите indexPath кратко отображаемой ячейки, а не ячейки, которая отображается на экране.
источник
попробуйте это, это работает. (например, в примере ниже у меня 3 ячейки.)
источник
Swift 3 и Swift 4:
Если вы хотите показать реальное число, вы можете добавить +1
источник