子滚动视图到达结束时滚动父滚动视图

时间:2015-09-12 10:02:51

标签: ios objective-c uiscrollview snapchat responder-chain

我在父滚动视图(不是直接子项)中包含子滚动视图。我想要的是父滚动视图在子滚动视图到达其内容结尾后立即开始向同一方向滚动。

这种开箱即用,但不是真的。现在,我必须抬起手指,使子滚动视图在孩子到达结束后开始滚动。

对此有何想法?

修改

通过在桌面视图单元格中向右滑动以显示聊天控制器,可以在Snapchat中查看我正在寻找的内容。

1 个答案:

答案 0 :(得分:0)

不确定我是否正确理解不是直接孩子的含义。但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是什么,比较targetContentOffsetscrollContentSizeHeightscrollViewHeight应该让你知道这个特定的滚动即将结束拖动到达滚动视图内容的结尾。

您可以更准确地计算diffOffsetanimationTime

如果在父卷轴中看不到完全可见的子视图,则阻止滚动可能会很好,因此只有向上滚动到某个位置时才会出现滚动功能。