iPhone - 如何对称地滚动两个UITableViews

时间:2011-08-04 22:04:43

标签: iphone uitableview scroll

在我的应用中,我有两个并排的tableView。当用户滚动时,我希望第二个同时滚动,所以它看起来几乎像一个有两个不同列的表。我有点迷失在如何做这个,有什么建议吗?

谢谢, 格雷格

5 个答案:

答案 0 :(得分:11)

方便的是,UITableView是UIScrollView的子类。存在一个UIScrollViewDelegate,它有这个方法:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

如果实现该方法,则可以获取contentOffset参数的scrollView属性。然后,你应该使用

- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated

并设置新内容偏移量。所以像这样:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    UIScrollView *otherScrollView = (scrollView == self.tableView1) ? self.tableView2 : self.tableView1;
    [otherScrollView setContentOffset:[scrollView contentOffset] animated:NO];
}

如果您愿意,可以转换为UITableView,但没有特别的理由这样做。

答案 1 :(得分:9)

您需要查看UIScrollViewDelegate - 说您有两个滚动视图, A B

使用滚动视图 A scrollViewDidScroll委托方法获取偏移量,然后在滚动视图 B setContentOffset >,传递你从代表那里获得的价值。

一旦你设置了委托方法,它实际上不应该超过2-3行代码。

答案 2 :(得分:7)

另外,用户滚动的tableview不应该在scrollViewDidScroll中发送setContentOffset:message,因为它会让app进入无限循环。所以应该实现额外的UIScrollViewDelegate方法以解决问题:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    beingScrolled_ = nil;
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{    
    if(beingScrolled_ == nil)
        beingScrolled_ = scrollView;
}

并修改Inspire48的版本scrollViewDidScroll:相应地:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    UIScrollView *otherScrollView = (scrollView == self.tableView1) ? self.tableView2 : self.tableView1;
    if(otherScrollView != beingScrolled)
    {
        [otherScrollView setContentOffset:[scrollView contentOffset] animated:NO];
    }
}

其中beingScrolled_是类型为UIScrollView的ivar

答案 3 :(得分:1)

UITableView是UIScrollView的子类。快速解决方案:

extension yourViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let otherScrollView = (scrollView == tableViewLeft) ? tableViewRight : tableViewLeft
        otherScrollView?.setContentOffset(scrollView.contentOffset, animated: false)
    }
}

并停止两个表的反弹

tableViewLeft.bounces = false
tableViewRight.bounces = false

如果要使垂直滚动指示器消失,请编写以下代码

tableViewLeft.showsVerticalScrollIndicator = false
tableViewRight.showsVerticalScrollIndicator = false

答案 4 :(得分:0)

快速滚动两个对称的uitableviews:

MW=[x if x <1000 else 1001 for x in MW]
b,bins = np.histogram(MW,bins=11,range=(0,1100))