14

我有一个UICollectionView,它有很多UICollectionViewCells。我想将单元格滚动到UICollectionView点击它的中心。我担心的是,即使我点击最后一个或顶部的单元格,它也应该移动到集合视图的中心。

我尝试设置contentInsets和偏移,但它们似乎不起作用。我想我必须在选择时更改内容大小,并在滚动开始时将其更改回原始大小。

4

4 回答 4

30

设置 contentInsets 应该在第一个和最后一个单元格周围留出一些额外的空间:

CGFloat collectionViewHeight = CGRectGetHeight(collectionView.bounds);
[collectionView
  setContentInset:
   UIEdgeInsetsMake(collectionViewHeight/2, 0, collectionViewHeight/2, 0) ];
  // nb, those are top-left-bottom-right

你应该打电话后:

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

传递正确的滚动位置很重要:UICollectionViewScrollPositionCenteredVertically

这应该正确地居中轻拍项目。

编辑

真的很奇怪,但是在将 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];
}

这对我来说可以。

于 2013-07-26T11:23:40.577 回答
13

用于滚动和居中屏幕以使被点击的项目可见的Swift 3解决方案:

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

这不会在collectionView!上方或下方添加插图

于 2017-09-08T10:53:52.680 回答
10

似乎这个错误是由滚动视图contentInsetUICollectionViewFlowLayout. 在我的测试中,设置layout.sectionInset而不是collectionView.contentInset消除问题。

根据上面接受的答案,我将消除解决方法,并进行更改:

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

[layout setSectionInset:UIEdgeInsetsMake(collectionViewHeight / 2, 0, collectionViewHeight / 2, 0)];
于 2014-03-25T00:38:12.060 回答
2

您可以使用scrollToItemAtIndexPath方法将选定(点击)单元格放置在 UICollectionView 的中心位置

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

您可以UICollectionViewScrollPositionCenteredVertically用于垂直居中位置

于 2016-12-29T11:47:56.760 回答