我有一个包含在父滚动视图中的子滚动视图(不是直接子滚动视图)。我想要的是,一旦子滚动视图到达其内容的末尾,父滚动视图就开始在相同的方向上滚动。
这是一种开箱即用的方法,但并不是真的。现在,我必须在子滚动视图到达结束后,抬起手指让父滚动视图开始滚动。
对此有什么想法吗?
编辑:我正在寻找的一个例子可以在Snapchat中看到,在表视图单元格中向右滑动以显示聊天控制器。
不确定我是否正确理解不是直接子意味着什么。但iOS会自动帮你完成只要你到达子视图的滚动结束它会让你滚动父视图的滚动。
为此,您需要为子节点实现:
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate: (BOOL)decelerate{
scrollView.bounces = NO;
}
scrollView.bounces = NO
不允许scrollView在滚动结束时跳回。所以它就停留在停止滚动的位置。
然后您需要从scrollViewDidScroll
方法为子控件触发父控件滚动。
类似:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat scrollViewHeight = scrollView.frame.size.height;
CGFloat scrollContentSizeHeight = scrollView.contentSize.height;
CGFloat scrollOffset = scrollView.contentOffset.y;
CGFloat offset = scrollContentSizeHeight - (scrollOffset + scrollViewHeight);
if (offset <= 0)
[self.parentView setContentOffset:CGPointMake(self.parentView.contentOffset.x, self.parentView.contentOffset.y + diffOffset) animated:YES];
}
其中diffOffset
是您希望parentScroll滚动的距离。
您可能更喜欢更高级的解决方案。
例如你可以实现
scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
所以你知道什么是velocity
的滚动,比较targetContentOffset
和scrollContentSizeHeight
和scrollViewHeight
应该让你知道这个特定的滚动即将结束拖动到达滚动视图内容的结束。
可以更准确地计算diffOffset
和animationTime
。
当子视图在父视图中不完全可见时,阻止子视图滚动可能会很好,这样滚动能力只有在向上滚动到特定位置时才会出现。