【问题标题】:Scroll parent scroll view when child scroll view reaches end当子滚动视图到达结束时滚动父滚动视图
【发布时间】:2015-12-08 20:17:16
【问题描述】:

我有一个包含在父滚动视图中的子滚动视图(不是直接子视图)。我想要的是,一旦子滚动视图到达其内容的末尾,父滚动视图就开始向同一方向滚动。

这种开箱即用的方法,但不是真的。现在我必须抬起手指才能让父滚动视图在子滚动视图结束后开始滚动。

对此有什么想法吗?

编辑:

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

【问题讨论】:

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


【解决方案1】:

不确定我是否正确理解不是直系子女是什么意思。但是,一旦您到达子视图滚动的末尾,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

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

【讨论】:

  • 感谢您的回复,我一定会尝试您的解决方案。
  • 在一个案例中,我创建了一个简单的测试项目,将两个UITableView 垂直放入UIScrollView 中,它确实有效。如果需要,我可以把它放在某个地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多