UICollectionView如何实现水平对齐滚动

时间:2015-08-17 22:56:32

标签: ios objective-c uicollectionview uicollectionviewlayout smooth-scrolling

我有一个UICollection已经实现并且有效,但我无法实现我想要的滚动。

以下是我UICollectionView的图片,我已将250的灰色单元格调整为250

enter image description here

我的问题是,当我开始滚动时,就会发生这种情况。

我的手机首先从最左边开始,但请注意如果我开始水平滚动会发生什么。

enter image description here

enter image description here

enter image description here

正如您所看到的,细胞之间的接缝向左移动越多,我滚​​动细胞越多。这不是我想要的。

我想要实现的是:细胞与中心对齐,当你滚动时,而不是细胞的中心越来越向左移动,我希望细胞留在中间。就像PageViewController一样,除了我希望它是UICollectionViewCells

我尝试添加以下代码,例如:

    - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
    float pageWidth = 210;

    float currentOffset = scrollView.contentOffset.x;
    float targetOffset = targetContentOffset->x;
    float newTargetOffset = 0;

    if (targetOffset > currentOffset)
        newTargetOffset = ceilf(currentOffset / pageWidth) * pageWidth;
    else
        newTargetOffset = floorf(currentOffset / pageWidth) * pageWidth;

    if (newTargetOffset < 0)
        newTargetOffset = 0;
    else if (newTargetOffset > scrollView.contentSize.width)
            newTargetOffset = scrollView.contentSize.width;

        targetContentOffset->x = currentOffset;
        [scrollView setContentOffset:CGPointMake(newTargetOffset, 0) animated:YES];
    }

这实现了均匀滚动,但我希望启用paging以及bounce

enter image description here

因为如果我启用pagingbounce,滚动非常流畅和优雅,但是如果我使用上面的代码,滚动非常粗糙和机械。

那么我怎样才能实现像苹果默认滚动一样平滑的滚动,我的UICollectionViewCell位于中间?

如果我没有充分解释这个问题,这篇文章here解释了我的问题,除了我使用的是一个单元格而不是三个单元格,我希望滚动顺畅和弹跳等。

1 个答案:

答案 0 :(得分:0)

我认为这应该有效(禁用分页):

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
  if (!decelerate) {
    // do your calculations
    [scrollView setContentOffset:CGPointMake(newTargetOffset, 0) animated:YES];
  }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
  // do your calculations
  [scrollView setContentOffset:CGPointMake(newTargetOffset, 0) animated:YES];
}