8

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

这种开箱即用的工作,但不是真的。现在我必须抬起手指才能在孩子到达结尾后让父滚动视图开始滚动。

对此有什么想法吗?

编辑:

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

4

1 回答 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您希望 parentScroll 滚动的距离在哪里。

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

例如,您可以实施

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

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

diffOffset而且您可以animationTime更准确地计算。

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

于 2015-09-12T18:25:32.177 回答