29

我正在尝试实现一个可滚动的自定义标签栏,并且在每个标签栏项目上都有分页。为此,我正在使用委托 scrollViewWillEndDragging:withVelocity:targetContentOffset: 它完美地解决了一个问题。

我的分页工作方式是,如果 contentOffset 靠近正确的项目,则 targetContentOffset 会更改为该项目的偏移量。左侧也一样。

问题是,每当我在第一个项目的左半部分和最后一个项目的右侧(滚动视图水平工作)它应该转到 ContentOffset 0 和最右边项目的内容偏移量(减去那些屏幕),但事实并非如此。

我检查了调试器,targetContentOffset->x 确实为 0(在第一种情况下 - 最左侧项目的左侧)。所以问题是 UIScrollView 没有在那里滚动。我迷路了。

这是我实现的委托:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
                 withVelocity:(CGPoint)velocity
          targetContentOffset:(inout CGPoint *)targetContentOffset{
     NSInteger index = lrintf(targetContentOffset->x/self.tabWidth);
     targetContentOffset->x = index * self.tabWidth;
}

这是解释我想要做什么的图表。

|-------|-------|-------|-------|-------|-------|-------|
|       |       |       |       |       |       |       |
|       |       |       |       |       |       |       |
|_______|_______|_______|_______|_______|_______|_______|

        |_______________________________________|
         where it is and i scroll it to the left

   <----|

   |_______________________________________|
              where it would stop

|_______________________________________|
        where i want it to stop
4

5 回答 5

15

这似乎是一个已知问题。经过一番调查并与其他人交谈后,有人建议这可能是一个错误,结果证明是正确的。我向 Apple 报告了它,它是否被标记为重复但仍处于打开状态。只为遇到同样问题的人解答。我像 Big Papoo 建议的那样解决它,通过使用接近我想要的偏移量(0.1 似乎可以做到)。右端也是如此。

于 2012-06-27T11:21:55.673 回答
9

在 iOS 6.0 上已修复的问题。

现在它可以正常工作了。

于 2012-10-10T13:08:19.980 回答
8

我尝试将最终偏移设置为稍微偏离零或 Big Papoo 建议的内容大小,但注意到这消除了过度滚动反弹。我对此的解决方案是检查原始 targetContentOffset 以查看它是否等于零或 contentSize,如果是则将其保留:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

    float expectedOffset = targetContentOffset->x;
    if (expectedOffset == 0 || expectedOffset == scrollView.contentSize.width) return; // Scroll view will bounce so leave the targetContentOffset.

    float targetOffset = [self roundedOffset:expectedOffset]; // Round your offset.

    // Adjust the offset to make sure it works.
    if (targetOffset == 0) targetOffset = 1;
    else if (targetOffset == SCROLLVIEW_WIDTH) targetOffset = SCROLLVIEW_WIDTH - 1;

    targetContentOffset->x = targetOffset;
}

您当然可以使用scrollViewDidEndDecelerating:to 将滚动视图移动 1 点。

于 2012-09-18T11:13:12.360 回答
3

我发现您可能会调查 2 个未记录的行为: - 将零设置为最终偏移量不起作用,我建议将 1 或任何大于零的值(0.5 可能有效,未经测试) - 您最好检查速度符号并计算您最终的偏移量将位于用户删除的当前点的左侧或右侧是手指。不要试图让滚动在另一侧向后退。

于 2012-06-26T23:37:20.713 回答
0

如果您使用的是水平表格视图,那么在您的 scrollViewWillEndDragging:withVelocity:targetContentOffset: 函数中,您可以调用:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:<index> inSection:<section>] atScrollPosition:UITableViewScrollPositionTop animated:YES];

我发现这比尝试在水平表视图中操作 targetContentOffset->y 要好得多。

于 2012-08-09T00:36:47.660 回答