scrollViewWillEndDragging:withVelocity:targetContentOffset:不在UISCrollView的边缘上工作

时间:2012-06-04 11:23:35

标签: ios uiscrollview ios5 uiscrollviewdelegate

我试图实现一个可滚动的自定义标签栏,并在每个标签栏项目上进行分页。为此,我使用了委托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

5 个答案:

答案 0 :(得分:15)

这似乎是一个已知问题。经过一些调查并与其他人交谈后,有人认为这可能是一个错误,结果证明是正确的。我向苹果公司报告过,它被标记为重复但仍然是开放的。只是回答那些有同样问题的人。我像Big Papoo建议的那样解决它,通过使用接近我想要的偏移量(0.1似乎这样做)。右端也一样。

答案 1 :(得分:9)

在iOS 6.0上修复了问题。

现在它可以正常工作。

答案 2 :(得分: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:来移动1点的滚动视图。

答案 3 :(得分:3)

我找到了2个您可能会调查的无证行为: - 设置零作为最终偏移量不起作用,我建议将1或大于零的任何值(0.5可能有效,未经测试) - 您最好检查速度符号并计算最终偏移量,使其位于用户移除的当前点的左侧或右侧。不要试图让滚动向后移动。

答案 4 :(得分:0)

如果您正在使用水平表视图,那么在scrollViewWillEndDragging:withVelocity:targetContentOffset:function中,您可以调用:

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

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