【问题标题】:Making two UIScrollView's scroll as one, or transferring inertia between scroll views将两个 UIScrollView 的滚动合二为一,或者在滚动视图之间传递惯性
【发布时间】:2014-01-24 12:22:51
【问题描述】:

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

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

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 的一个单元格中,但如果需要,它也可以是一个对等点。我正在尝试确定使这两个滚动视图显示为一个的最佳方法。

【问题讨论】:

    标签: ios cocoa-touch uiscrollview


    【解决方案1】:

    据我所知,你做了正确的事。 viewDidScroll 应该被多次调用,即使在用户抬起手指并且滚动视图返回到某个位置之后。

    当用户拖动其中一个时,我使用完全相同的方法来同步滚动几个滚动视图。完美运行。

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

    【讨论】:

    • 在将子滚动视图的移动转移到父级时,将子滚动视图上的偏移量重置为 0 scrollView.contentOffset = CGPointMake(0, 0); 是否正确?我觉得这是在投掷而不是主动拖动时导致惯性损失。
    • 我不确定,因为我真的看不出它是如何工作的,以及你想做什么。尝试记录您在 didScroll 中收到的所有值,它会让您了解父视图发生了什么 - 并且您可以从那里扣除您需要对子视图执行的操作。
    【解决方案2】:

    我这样做了,如果它适合你,请告诉我

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

    【讨论】:

    • 这里的tableviews高度一样吗?
    • 是的,但是如果您有不同的高度,您可能应该将 contentOffset 设置为与高度或 contentSize 成比例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多