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

dvi*_*ira 28 uiscrollview uiscrollviewdelegate ios ios5

我正在尝试实现一个可滚动的自定义标签栏,并在每个标签栏项目上进行分页.因为我正在使用委托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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

   <----|

   |_______________________________________|
              where it would stop

|_______________________________________|
        where i want it to stop
Run Code Online (Sandbox Code Playgroud)

dvi*_*ira 15

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


Ran*_*hak 9

问题已在iOS 6.0上修复.

现在它可以正常工作.


Ada*_*den 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;
}
Run Code Online (Sandbox Code Playgroud)

你当然scrollViewDidEndDecelerating:可以用来移动1点的scrollview.