UICollectionView如何实现水平对齐滚动
UICollectionView How to implement horizontal align scrolling
我有一个 UICollection
已经实现并且可以工作,但是我无法实现我想要的滚动。
这是我的 UICollectionView
的照片,我已通过 250
将灰色单元格的大小调整为 250
。
我的问题是,当我开始滚动时,会发生这种情况。
我的单元格首先从最左边开始,但请注意如果我开始水平滚动会发生什么。
如您所见,我在单元格中滚动得越多,单元格之间的接缝就会向左移动。这不是我想要的。
我想要实现的是:单元格居中对齐,当你滚动时,我希望单元格保持在中间,而不是单元格的中心越来越向左移动。很像 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
。
因为如果我启用 paging
和 bounce
,滚动会非常流畅和优雅,但是如果我使用上面的代码,滚动会非常粗糙和机械。
那么如何实现像苹果默认滚动一样平滑的滚动,我的 UICollectionViewCell
居中于中间?
如果我没有很好地解释问题,这个 post here 解释了我的问题,除了我使用一个单元格而不是三个单元格,并且我希望滚动平滑和弹跳等等
我认为这应该可行(禁用分页):
- (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];
}
我有一个 UICollection
已经实现并且可以工作,但是我无法实现我想要的滚动。
这是我的 UICollectionView
的照片,我已通过 250
将灰色单元格的大小调整为 250
。
我的问题是,当我开始滚动时,会发生这种情况。
我的单元格首先从最左边开始,但请注意如果我开始水平滚动会发生什么。
如您所见,我在单元格中滚动得越多,单元格之间的接缝就会向左移动。这不是我想要的。
我想要实现的是:单元格居中对齐,当你滚动时,我希望单元格保持在中间,而不是单元格的中心越来越向左移动。很像 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
。
因为如果我启用 paging
和 bounce
,滚动会非常流畅和优雅,但是如果我使用上面的代码,滚动会非常粗糙和机械。
那么如何实现像苹果默认滚动一样平滑的滚动,我的 UICollectionViewCell
居中于中间?
如果我没有很好地解释问题,这个 post here 解释了我的问题,除了我使用一个单元格而不是三个单元格,并且我希望滚动平滑和弹跳等等
我认为这应该可行(禁用分页):
- (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];
}