UITableView与自定义类似分页的行为

我正在尝试在UITableView中实现自定义大小页面的分页。 我想要实现的是让活动单元格的顶部与tableView的顶部alignment,同时仍然在tableView的底部显示下一个单元格的顶部(以使用户滚动并查看更多单元格) 。

我的细胞都是一样的高度。

如果我设置paging=YES这会导致略微偏移,随着我在页面上的弹跳而增加。 这是由于我的tableView比单个单元格略高,单元格高度/页面大小不alignment。

我已尝试使用分页启用不同的东西。 我试着将tableView的大小设置为单元格的高度,但是closures了剪裁和遮罩,所以用户仍然可以看到下一个单元格。 这不起作用,因为在单元格滚动到tableView的边界框之前的最后一个ms,下一个单元格仅添加到底层的scrollView。

然后我开始实现不同的scrollView委托方法来模仿分页行为 – 我似乎无法做到。

除此之外,我还尝试过这样的事情:

 - (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { float cellHeight = [myCell rowHeight]; int index = floorf(scrollView.contentOffset.y / cellHeight); *targetContentOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y = (index * cellHeight)); } 

虽然这样做是正确的,但它的行为不像启用分页的scrollView / tableView。

我在这里发现了一些人试图达到同样的东西的post,但是答案却遭受着与我自己尝试的任何事情相同的“非原生快感”。

感谢您给予的任何帮助。

iOS> = 5.0

实现scrollViewWillEndDragging:withVelocity:targetContentOffset:返回最接近targetContentOffset的单元格的顶部坐标,不是最接近您的起始偏移量。 jjv360提供的解决scheme做得很好,但是您可能需要稍微调整一下,具体取决于您的单元格的平均高度(jjv360的解决scheme在真正的大单元格上可能太快)。

我只想补充一点,你可以通过改变它的decelerationRate属性(只要在init / viewDidLoad / where中做一次),就可以使UITableView的减速更快,从而更像UIScrollView

 self.tableView.decelerationRate = UIScrollViewDecelerationRateFast; 

如果closures分页,则可以使用UIScrollView委托函数:

 -(void)scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { // Get index path for target row NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:(*targetContentOffset)]; // Set new target (*targetContentOffset) = [self.tableView rectForRowAtIndexPath:indexPath].origin; } 

我用这个代码解决了这个问题:

 - (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView { CGFloat pageWidth = self.collectionView.frame.size.width + 10 /* Optional Photo app like gap between images */; _currentPage = floor((self.collectionView.contentOffset.x - pageWidth / 2) / pageWidth) + 1; NSLog(@"Dragging - You are now on page %i", _currentPage); } -(void) scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset { CGFloat pageWidth = self.collectionView.frame.size.width + 10; int newPage = _currentPage; if (velocity.x == 0) // slow dragging not lifting finger { newPage = floor((targetContentOffset->x - pageWidth / 2) / pageWidth) + 1; } else { newPage = velocity.x > 0 ? _currentPage + 1 : _currentPage - 1; if (newPage < 0) newPage = 0; if (newPage > self.collectionView.contentSize.width / pageWidth) newPage = ceil(self.collectionView.contentSize.width / pageWidth) - 1.0; } NSLog(@"Dragging - You will be on %i page (from page %i)", newPage, _currentPage); *targetContentOffset = CGPointMake(newPage * pageWidth, targetContentOffset->y); } 

感谢http://www.mysamplecode.com/2012/12/ios-scrollview-example-with-paging.html指出正确的方式&#x3002;