Ios ScrollViewWillendDraging:withVelocity:targetContentOffset:不处理UISCrollView的边缘
我正在尝试实现一个自定义选项卡栏,它是可滚动的,并且在每个选项卡栏项上都有分页。为此,我使用了委托ScrollViewWillendDraging:withVelocity:targetContentOffset:它可以很好地解决一个问题 我的分页工作方式是,如果contentOffset靠近正确的项,则targetContentOffset将更改为该项的偏移量。左边也是一样 问题是,每当我在第一个项目的左半部分和最后一个项目的右半部分时(滚动视图水平工作),它应该转到ContentOffset 0和最右边项目的内容偏移量(减去屏幕上的内容偏移量),但它没有 我使用调试器进行了检查,targetContentOffset->x实际上是0(在第一种情况下,是最左侧项的左侧)。所以问题是UIScrollView没有在那里滚动。我迷路了 这是我的代表:Ios ScrollViewWillendDraging:withVelocity:targetContentOffset:不处理UISCrollView的边缘,ios,uiscrollview,ios5,uiscrollviewdelegate,Ios,Uiscrollview,Ios5,Uiscrollviewdelegate,我正在尝试实现一个自定义选项卡栏,它是可滚动的,并且在每个选项卡栏项上都有分页。为此,我使用了委托ScrollViewWillendDraging:withVelocity:targetContentOffset:它可以很好地解决一个问题 我的分页工作方式是,如果contentOffset靠近正确的项,则targetContentOffset将更改为该项的偏移量。左边也是一样 问题是,每当我在第一个项目的左半部分和最后一个项目的右半部分时(滚动视图水平工作),它应该转到ContentOffset
- (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中似乎不存在。无论如何,它现在似乎已经关闭了,但我不知道他们是否会发布修复程序。