当子滚动视图到达末尾时,滚动父滚动视图

8
我有一个子滚动视图,包含在父滚动视图中(不是直接子级)。 我想要的是当子滚动视图到达其内容的末尾时,父滚动视图立即开始以同样的方向滚动。这种方法似乎可以工作,但实际上并不能完全满足需求。目前我必须抬起手指才能使父滚动视图在子滚动视图到达末尾后开始滚动。对此有何想法吗?
编辑:我正在寻找的示例可以在 Snapchat 中看到,通过在表视图单元格右滑以显示聊天控制器。

这是一个很好的示例资料库,适用于此任务: https://github.com/goktugyil/EZSwipeController - Esqarrouth
1个回答

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 是您希望父级滚动条滚动的距离。

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

例如,您可以实现

scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

所以你知道什么是滚动的速度,通过比较targetContentOffsetscrollContentSizeHeightscrollViewHeight,你应该知道这个特定的滚动即将结束拖动并到达滚动视图内容的末尾。

而且你可以更准确地计算diffOffsetanimationTime

当子视图没有完全显示在父滚动视图中时,阻止滚动可能会很好,这样只有当你向上滚动到某个位置时才会出现滚动能力。


谢谢您的回复,我一定会尝试您的解决方案。 - oyvindhauge
以防万一,我创建了一个简单的测试项目,在其中将两个 UITableView 垂直放置在 UIScrollView 中,并且它可以正常工作。 如果需要,我可以把它放在某个地方。 - teamnorge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接