将两个UIScrollView的滚动作为一个滚动,或在滚动视图之间传递惯性

时间:2014-01-06 23:19:32

标签: ios cocoa-touch uiscrollview

在我们的应用中,您可以通过搜索来自多个第三方来源的选项来构建问题。大多数搜索结果都显示为全宽的tableview单元格,因为它们的数据适合该格式(我可以在缩略图旁边显示一堆元数据文本)。

然而,在图像的情况下,集合视图更有意义。但是现在我遇到了包含垂直滚动集合视图的垂直滚动tableview的问题。

http://www.screencast.com/t/7Z48zkkW

我可以通过在集合视图上捕获viewDidScroll并在适当的偏移处更新父滚动视图来使其工作,但只有在用户主动拖动集合视图时才能正常工作。

self.collectionVC.scrollViewDidScroll = ^(UIScrollView *scrollView) {
    @strongify(self);
    if (self.tableView.contentOffset.y < self.scrollingHeightOffset && scrollView.contentOffset.y > 0) {
        CGFloat maxheight = MIN(self.scrollingHeightOffset, self.tableView.contentOffset.y + scrollView.contentOffset.y);
        self.tableView.contentOffset = CGPointMake(0, maxheight);
        scrollView.contentOffset = CGPointMake(0, 0);
    } else if (scrollView.contentOffset.y < 0 && self.tableView.contentOffset.y > -topGuide) {
        CGFloat minheight = MAX(-topGuide, self.tableView.contentOffset.y + scrollView.contentOffset.y);
        self.tableView.contentOffset = CGPointMake(0, minheight);
        scrollView.contentOffset = CGPointMake(0, 0);
    }
};

当“投掷”集合视图时,滚动突然停止,失去了集合视图的惯性。触摸tableview进行滚动有一个不同的问题,因为当它到达结尾并滚动集合视图时我没有捕获它。

现在,集合视图位于tableview的单元格中,但如果需要,它也可以是对等体。我正在尝试确定将这两个滚动视图显示为一个的最佳方法。

2 个答案:

答案 0 :(得分:0)

据我所知,你做对了。即使用户抬起手指并且滚动视图返回到某个位置,也应该多次调用viewDidScroll

当用户拖动其中一个时,我使用完全相同的方法滚动耦合滚动视图。效果很好。

您可能想要检查此方法中的计算逻辑。在用户抬起手指后查看是否要求所有更改,但是您以错误的方式定位其他滚动视图。

答案 1 :(得分:0)

我这样做了,让我知道它是否适合你

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView1.panGestureRecognizer addTarget:self action:@selector(didRecognizePanGesture:)];
    [self.tableView2.panGestureRecognizer addTarget:self action:@selector(didRecognizePanGesture:)];

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (self.selectedTableView == scrollView)
    {
        if (scrollView == self.tableView1)
        {
            self.tableView2.contentOffset = scrollView.contentOffset;
        }
        else if (scrollView == self.tableView2)
        {
            self.tableView1.contentOffset = scrollView.contentOffset;
        }
    }
}

- (void)didRecognizePanGesture:(UIPanGestureRecognizer*)gesture
{
    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        if (self.selectedTableView != nil) //this is gonna make stop the previous scrollView
        {
            [self.selectedTableView setContentOffset:self.selectedTableView.contentOffset animated:NO];
        }
        self.selectedTableView = (UITableView*)gesture.view;
    }
}