5

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

我的细胞都等高。

如果我设置paging=YES这会导致轻微的偏移量,当我浏览页面时会增加。这是因为我的 tableView 比单个单元格略高,并且单元格高度/页面大小未对齐。

我在启用分页的情况下尝试了不同的方法。我尝试将 tableView 的大小设置为单元格的高度,然后关闭剪辑和遮罩,以便用户仍然可以看到下一个单元格。这不起作用,因为下一个单元格仅在单元格滚动到 tableView 的边界框之前的最后一毫秒添加到底层滚动视图。

然后我开始实现不同的 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

4

3 回答 3

11

实施scrollViewWillEndDragging:withVelocity:targetContentOffset:以返回最接近的单元格的顶部坐标targetContentOffset,而不是最接近您的起始偏移量。jjv360 提供的解决方案可以很好地做到这一点,但您可能需要根据单元的平均高度对其进行一些调整(jjv360 的解决方案在真正的大单元上可能过于活泼)。

我想补充一点,您可以通过更改其属性来使UITableView' 减速更快以表现得更像分页(只需在 init/viewDidLoad/wherever 中执行一次)。UIScrollViewdecelerationRate

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast;
于 2012-09-04T22:08:32.200 回答
3

如果您关闭分页,您可以使用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;

}
于 2012-09-04T21:46:21.700 回答
1

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

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

于 2013-06-21T06:44:46.290 回答