Как расширить UICollectionView contentSize при разрешении пейджинга?
Я делаю простой UICollectionView
с включенным механизмом пейджинга, и все работает нормально. Хотя при прокрутке до последней страницы количество ячеек не отображается полностью на экране, а последняя страница содержит некоторые ячейки предыдущей страницы.
Как мне расширить contentSize
для UICollectionView
, чтобы последняя страница не содержала ячеек предыдущей страницы?
Пример здесь: UICollectionView
прокручивает по горизонтали 6 ячеек, таким образом:
Страница 1: cell0 - cell1 - cell2 - cell3
Прокрутка: cell2-cell3-cell4-cell5//Не ожидается: как изменить на: cell4-cell 5 на стр. 2.
РЕЗЮМЕ:
Я хочу установить
collectionView.contentSize = numberOfPage * collectionView.frame
НЕ
collectionView.contentSize = numberOfCell * (cellFrame + spacing)
Ответы
Ответ 1
Вам нужно подклассом UICollectionViewLayout
и переопределить метод collectionViewContentSize
. Я подклассифицировал UICollectionViewFlowLayout
, поэтому мне не пришлось бы переписывать весь код макета.
Я создаю сетку 4x4, поэтому мой метод выглядит следующим образом:
- (CGSize)collectionViewContentSize
{
NSInteger itemCount = [self.collectionView numberOfItemsInSection:0];
NSInteger pages = ceil(itemCount / 16.0);
return CGSizeMake(320 * pages, self.collectionView.frame.size.height);
}
Обратите внимание, что при использовании настраиваемого макета вы теряете возможность устанавливать некоторые из свойств отображения в построителе интерфейса. Вы можете установить их программно в методе init
вашего пользовательского подкласса UICollectionViewLayout. Здесь мое для справки:
- (id)init
{
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (void)setup
{
self.itemSize = CGSizeMake(65.0f, 65.0f);
self.minimumLineSpacing = 15;
self.sectionInset = UIEdgeInsetsMake(7.5f, 7.5f, 30.0f, 7.5f);
[self setScrollDirection:UICollectionViewScrollDirectionHorizontal];
}
Ответ 2
Для горизонтального поискового вызова
if(CollectionView.pagingEnabled)
{
int numberOfPages = floor(collectionView.contentSize.width /
collectionView.frame.size.width) + 1;
CGFloat
float requierdWidth=self.collectionView.frame.size.width*numberOfPages;
self.Layout.footerReferenceSize=CGSizeMake(requierdWidth-self.collectionView.contentSize.width,0);
}
Ответ 3
Ответ работает хорошо, хотя для нашего кода у нас был один раздел на странице. Таким образом, это означало, что переопределение для нашего класса макета было просто
-(CGSize) collectionViewContentSize {
return CGSizeMake(CGRectGetWidth(self.collectionView.frame) *
[self.collectionView numberOfSections],
CGRectGetHeight(self.collectionView.frame)) ;
}
Ответ 4
Вы можете настроить контент с помощью метода viewDidLayoutSubviews:
. Этот метод вызывается, когда просмотр коллекции и все ячейки помещаются в view
, так что вы можете настроить ячейку.
Ответ 5
Я думаю, что вы должны подклассифицировать UICollectionViewLayout
и создать свой собственный макет для управления этими проблемами.
Ответ 6
У меня есть ответ, который не требует какого-либо подкласса.
In -viewDidLoad, подсчитайте количество элементов на странице, которые у вас будут, и сколько страниц у вас будет. Сохраните эти значения в свойствах.
self.numberOfItemsPerPage = NumberOfRows * NumberOfColumns;
self.numberOfPages = ceilf((CGFloat)self.items.count / (CGFloat)self.numberOfItemsPerPage);
Затем в -collectionView: numberOfItemsInSection: просто ложь:
return self.numberOfItemsPerPage * self.numberOfPages;
У вас, конечно, будет больше клеток, чем контент, не так ли? Итак, in -collectionView: cellForItemAtIndexPath: просто верните нуль для дополнительных ячеек:
if (indexPath.item > [self.items count] - 1) {
//We have no more items, so return nil. This is to trick it to display actual full pages.
return nil;
}
Вот вы: полная, прокручиваемая финальная страница. По моему мнению, режим горизонтальной прокрутки должен быть только по умолчанию.