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指出正确的方式。