如何在点击UICollectionView时将其居中?

时间:2013-07-26 10:54:41

标签: ios objective-c uiscrollview uicollectionview

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

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

4 个答案:

答案 0 :(得分:28)

设置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];
}

它适用于我。

答案 1 :(得分:10)

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

根据上面接受的答案,我将取消变通方法,并更改:

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

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

答案 2 :(得分:9)

Swift 3 滚动和居中屏幕的解决方案,使点按的项目可见:

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

这不会在collectionView

之上或之下添加插页

答案 3 :(得分:2)

您可以使用 @EventBusListenerMethod public void closeSymmUsageWindow(RefreshMainViewEvent event) { logger.debug("Received {}", event); //blah } 方法将选定(点按)的单元格置于UICollectionView中心位置

scrollToItemAtIndexPath

您可以将[collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:true]; 用于垂直居中位置