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

我试图实现一个可滚动的自定义标签栏,并在每个标签栏项目分页。 为此,我使用委托scrollViewWillEndDragging:withVelocity:targetContentOffset:它完美的一个问题。

我的分页工作的方式是,如果contentOffset靠近正确的项目,它targetContentOffset更改为该项目的偏移量。 左边是同样的东西。

问题是,每当我在第一个项目的左半部分和最后一个(滚动视图水平工作)的权利,它应该去的ContentOffset 0和最右边的项目的内容偏移量(减屏幕),但它不。

我使用debugging器进行了检查,并且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 

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

我试图设置最后的偏移量略微零零或大Papoobuild议的内容大小,但注意到这消除了过度滚动反弹。 我的解决scheme是检查原始的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点的滚动视图。

问题在iOS 6.0上修复。

现在它应该如此。

我发现了2个无证的行为,你可以调查: – 设置零作为最终的抵消不行,我build议把1或大于零的任何东西(0.5可以工作,没有testing) – 你最好检查速度标志和计算您在用户移除的当前点的左侧或右侧的最终偏移量是手指。 不要试图让滚动在另一边倒退。

如果您使用的是水平表格视图,那么在您的scrollViewWillEndDragging:withVelocity:targetContentOffset:函数中,可以调用:

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

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