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

oyv*_*uge 6 objective-c uiscrollview ios responder-chain snapchat

我有一个包含在父滚动视图(不是直接子项)中的子滚动视图.我想要的是父滚动视图在子滚动视图到达其内容结尾时开始以相同的方向滚动.

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

有什么想法吗?

编辑:

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

tea*_*rge 0

不确定我是否正确理解非直系子女的含义。但是,一旦您到达子视图滚动的末尾,iOS 就会自动为您执行此操作,它应该让您滚动父滚动。

为此,您需要为孩子实施:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:   (BOOL)decelerate{
   scrollView.bounces = NO;
}
Run Code Online (Sandbox Code Playgroud)

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];
}
Run Code Online (Sandbox Code Playgroud)

在哪里diffOffset是您希望parentScroll 滚动的距离。

您可能更喜欢更高级的解决方法。

例如你可以实现

scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
Run Code Online (Sandbox Code Playgroud)

所以你知道什么是velocity卷轴,比较targetContentOffset和scrollContentSizeHeightscrollViewHeight应该让你知道这个特定的滚动即将结束拖动到达滚动视图内容的末尾。

你可以计算diffOffset并animationTime准确。

当子视图在父滚动中不完全可见时,阻止子视图的滚动可能会很好,因此只有当您向上滚动到特定位置时才会出现滚动功能。