我有一个子滚动视图,包含在父滚动视图中(不是直接子级)。 我想要的是当子滚动视图到达其内容的末尾时,父滚动视图立即开始以同样的方向滚动。这种方法似乎可以工作,但实际上并不能完全满足需求。目前我必须抬起手指才能使父滚动视图在子滚动视图到达末尾后开始滚动。对此有何想法吗?
编辑:我正在寻找的示例可以在 Snapchat 中看到,通过在表视图单元格右滑以显示聊天控制器。
编辑:我正在寻找的示例可以在 Snapchat 中看到,通过在表视图单元格右滑以显示聊天控制器。
我不确定我是否正确理解了“不是直接子项”的含义。但是在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
所以你知道什么是滚动的速度
,通过比较targetContentOffset
、scrollContentSizeHeight
和scrollViewHeight
,你应该知道这个特定的滚动即将结束拖动并到达滚动视图内容的末尾。
而且你可以更准确地计算diffOffset
和animationTime
。
当子视图没有完全显示在父滚动视图中时,阻止滚动可能会很好,这样只有当你向上滚动到某个位置时才会出现滚动能力。
UITableView
垂直放置在 UIScrollView
中,并且它可以正常工作。 如果需要,我可以把它放在某个地方。 - teamnorge