Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ScrollViewWillendDraging:withVelocity:targetContentOffset:不处理UISCrollView的边缘_Ios_Uiscrollview_Ios5_Uiscrollviewdelegate - Fatal编程技术网

Ios ScrollViewWillendDraging:withVelocity:targetContentOffset:不处理UISCrollView的边缘

Ios ScrollViewWillendDraging:withVelocity:targetContentOffset:不处理UISCrollView的边缘,ios,uiscrollview,ios5,uiscrollviewdelegate,Ios,Uiscrollview,Ios5,Uiscrollviewdelegate,我正在尝试实现一个自定义选项卡栏,它是可滚动的,并且在每个选项卡栏项上都有分页。为此,我使用了委托ScrollViewWillendDraging:withVelocity:targetContentOffset:它可以很好地解决一个问题 我的分页工作方式是,如果contentOffset靠近正确的项,则targetContentOffset将更改为该项的偏移量。左边也是一样 问题是,每当我在第一个项目的左半部分和最后一个项目的右半部分时(滚动视图水平工作),它应该转到ContentOffset

我正在尝试实现一个自定义选项卡栏,它是可滚动的,并且在每个选项卡栏项上都有分页。为此,我使用了委托ScrollViewWillendDraging: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
|-------|-------|-------|-------|-------|-------|-------|
|       |       |       |       |       |       |       |
|       |       |       |       |       |       |       |
|_______|_______|_______|_______|_______|_______|_______|
|_______________________________________|
它在哪里,我将它向左滚动

我发现了2种您可以调查的未记录行为: -设置零因为最终偏移不起作用,我建议设置1或任何大于零的值(0.5可能起作用,未测试)
-您最好检查速度符号,并计算最终偏移量,使其位于用户被移除的当前点的左侧或右侧。不要试图使滚动在另一侧向后移动。

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

如果使用的是水平表视图,则在ScrollViewWillendDraging:withVelocity:targetContentOffset:函数中,可以调用:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:<index> inSection:<section>] atScrollPosition:UITableViewScrollPositionTop animated:YES];
[self.tableView ScrollToRowatineXpath:[nsIndepath indexPathForRow:Insettion:]atScrollPosition:UITableView ScrollPositionTop动画:是];

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

我尝试将最终偏移设置为稍微偏离零的值或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;
}

当然,您可以使用
ScrollViewDiEndDecelling:
移动scrollview到1点。

iOS 6.0上修复的问题


现在它正常工作了。

非常感谢您的回答。你说得对。一、 同样,调查并与其他人交谈后发现这是一个bug。只是忘了回答我自己的问题,对不起(如果你想了解更多细节,请看一下)。像0.1这样的偏移量似乎可以做到这一点。无论如何,非常感谢。我也遇到了这个问题。你有没有可能发布苹果的bug ID号或者更好的,一个指向OpenRadar条目的链接,以帮助我自己,或者其他人发布一份重复的bug报告?(众所周知,苹果公司会根据收到的报告数量优先修复bug。)当然。这是10255505的复制品,但在OpenRadar中似乎不存在。无论如何,它现在似乎已经关闭了,但我不知道他们是否会发布修复程序。