Подтвердить что ты не робот

Как расширить 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)

4b9b3361

Ответ 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;
    }

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