具有类似自定义分页行为的UITableView



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

我的牢房都是一样高的。

如果我设置paging=YES,这会导致一个轻微的偏移,随着我在页面中的轻弹,偏移会增加。这是因为我的tableView比单个单元格稍高,并且单元格高度/页面大小不对齐。

我已经尝试了启用分页的不同方法。我尝试将tableView的大小设置为单元格的高度,但随后关闭了剪裁和遮罩,这样用户仍然可以看到下一个单元格。这不起作用,因为下一个单元格仅在单元格滚动到tableView的边界框之前的最后一毫秒添加到基础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完全不同。

我在这里发现了一些试图实现同样目标的人的帖子,但答案与我自己尝试的任何事情都有着相同的"非本地快照感觉"。

谢谢你的帮助。

iOS>=5.0

实现scrollViewWillEndDragging:withVelocity:targetContentOffset:以返回最接近targetContentOffset的单元格的顶部坐标,而不是最接近您的起始偏移量。jjv360提供的解决方案做得很好,但你可能想根据你的细胞平均有多高来调整一下(jjv360'的解决方案可能对真正大的细胞太快了)。

我只想补充一点,通过更改decelerationRate属性(只需在init/viewDidLoad/where中执行一次),可以使UITableView的减速速度更快,表现得更像分页的UIScrollView

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast;

如果关闭分页,则可以使用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指的是正确的方向。

最新更新