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