让两个UIScrollView同步滚动,或在滚动视图之间传递惯性。

6
在我们的应用程序中,您可以通过从多个第三方来源搜索选项来构建问题。这些搜索结果中的大多数都显示为全宽度的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);
    }
};

当“flinging”集合视图时,滚动会突然停止,失去集合视图的惯性。触摸表格视图进行滚动会有不同的问题,因为我没有捕获到它何时到达末尾并滚动集合视图。
现在集合视图位于表格视图的单元格中,但如果必要,它也可以是对等的。我正在尝试确定使这两个滚动视图看起来像一个的最佳方法。
2个回答

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;
    }
}

你的表格视图在这里高度一致吗? - Bob Spryn
是的,但如果您有不同的高度,您可能应该将contentOffset设置为与高度或contentSize成比例。 - Camo

0
据我所知,你做得很对。即使用户放手并且滚动视图返回到某个位置,viewDidScroll也应该被调用多次。
当用户拖动其中一个scrollView时,我使用完全相同的方法来同步滚动几个scrollViews。效果非常好。
您可能需要检查此方法内部的计算逻辑。查看是否在用户放手后调用所有更改,但以错误的方式定位其他滚动视图。

当将子滚动视图的运动传递给父视图时,我在重置偏移量为0 scrollView.contentOffset = CGPointMake(0, 0); 方面是正确的吗?我感觉这会导致惯性丢失,而不是主动拖动。 - Bob Spryn
我不确定,因为我无法看到它是如何运作的以及您试图做什么。尝试在 didScroll 中记录接收到的所有值,这将让您了解父视图的情况 - 然后您可以推断出您需要对子视图做什么操作。 - sha

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