【问题标题】:UITableView with custom paging-like behaviour具有自定义分页行为的 UITableView
【发布时间】:2012-08-29 14:14:35
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • 你搞定了吗?
  • @aqs 抱歉,不,它从来没有真正起到过分页的作用。
  • 没关系。我把这个github.com/100grams/HGPageScrollView 修改为垂直滚动。服务于我的目的

标签: ios uitableview uiscrollview


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

【讨论】:

    【解决方案2】:

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

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

    self.tableView.decelerationRate = UIScrollViewDecelerationRateFast;
    

    【讨论】:

    • 谢谢 Filip,我现在就试试看。使用本机行为进行分页时,您不能跳转多个页面,如果我将端点钳制到 targetContentOffset 会发生这种情况 - 它只需要是下一个或上一个单元格。 decelerationRate - 我以前没见过,太棒了:)
    • 启用分页后,decelerationRate 似乎不起作用。无论如何,感谢您指出这个 API :)
    【解决方案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;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-30
      • 1970-01-01
      • 2016-09-12
      • 2021-07-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2016-12-03
      • 2023-02-02
      相关资源
      最近更新 更多