2013-07-26 4 views
10

У меня есть UICollectionView, и на нем довольно много UICollectionViewCells. Я хочу прокрутить ячейку до середины UICollectionView, когда она прослушивается. Меня беспокоит, что даже если я нажимаю последнюю или верхнюю ячейку, она должна перемещаться в центр представления коллекции.Как центрировать UICollectionView, когда он прослушивается?

Я попытался установить contentInsets и смещения, но они, похоже, не работают. Я думаю, мне придется изменить размер контента на выбор и изменить его обратно на оригинал при прокрутке.

+0

Отметьте отредактированный ответ, я добавил некоторые изменения к нему – Mikhail

ответ

26

Установка contentInsets должно дать некоторое дополнительное пространство вокруг первой и последней клетки:

После следует назвать:

[collectionView scrollToItemAtIndexPath:selectedItemPath 
    atScrollPosition:UICollectionViewScrollPositionCenteredVertically 
    animated:YES]; 

Это важно передать правильное положение прокрутки: UICollectionViewScrollPositionCenteredVertically

Это должен должным образом отрезать предмет.

EDIT

Это действительно странно, но после установки UIEdgeInsets методы вида коллекции scrollToItemAtIndexPath не работает должным образом, поэтому я сделать некоторые изменения:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    CGFloat collectionViewHeight = CGRectGetHeight(self.collectionView.frame); 
    [collectionView setContentInset:UIEdgeInsetsMake(collectionViewHeight/2, 0, collectionViewHeight/2, 0)]; 

    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath]; 
    CGPoint offset = CGPointMake(0, cell.center.y - collectionViewHeight/2); 
    [collectionView setContentOffset:offset animated:YES]; 
} 

это прекрасно работает для меня.

+0

благодарит за работу. –

+0

Typo: 'UIEdgeInstetsMake' должен быть' UIEdgeInsetsMake'. –

+0

Я получаю «отсутствие видимого интерфейса для UICollectionView объявляет селектор setContentInsets» – shim

9

Похоже, что эта ошибка вызвана плохим взаимодействием между видом прокрутки contentInset и UICollectionViewFlowLayout. В моем тестировании установка layout.sectionInset вместо collectionView.contentInset устранила проблему.

На основании принятого ответа выше, я бы устранить обходной путь, и изменение:

[collectionView setContentInset:UIEdgeInsetsMake(collectionViewHeight/2, 0, collectionViewHeight/2, 0)]; 

в

[layout setSectionInset:UIEdgeInsetsMake(collectionViewHeight/2, 0, collectionViewHeight/2, 0)]; 
+0

Удивительное решение, которое исправляет обходной путь от Михаила. Благодаря! – jomafer

2

Вы можете использовать scrollToItemAtIndexPath способ положить выбранный (постучал) ячейки в центральное положение в UICollectionView

[collectionView scrollToItemAtIndexPath:indexPath 
         atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally 
           animated:true]; 

Вы можете использовать UICollectionViewScrollPositionCenteredVertically для вертикального центрированного положения

1

Swift 3 решения для прокрутки и центровки экрана, чтобы сделать повернутый элемент видимым:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    collectionView.scrollToItem(at: indexPath, at: .centeredVertically, animated: true) 
} 

Это не добавляет вставки выше или под collectionView!

Смежные вопросы