Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-如何对称滚动两个UITableView_Iphone_Uitableview_Scroll - Fatal编程技术网

iPhone-如何对称滚动两个UITableView

iPhone-如何对称滚动两个UITableView,iphone,uitableview,scroll,Iphone,Uitableview,Scroll,在我的应用程序中,我有两个并排的桌面视图。当用户滚动时,我希望第二个可以同时滚动,因此它看起来几乎像一个包含两个不同列的表。我不知道该怎么做,有什么建议吗 谢谢, Greg您需要查看UIScrollViewDelegate——假设您有两个滚动视图,A和B 使用scroll viewA的scroll ViewDidScrolldelegate方法获取偏移量,然后在同一方法中调用scroll viewB上的setContentOffset,传递从委托获得的值 实际上,一旦设置了委托方法,它不应该超过

在我的应用程序中,我有两个并排的桌面视图。当用户滚动时,我希望第二个可以同时滚动,因此它看起来几乎像一个包含两个不同列的表。我不知道该怎么做,有什么建议吗

谢谢,
Greg

您需要查看
UIScrollViewDelegate
——假设您有两个滚动视图,AB

使用scroll viewA
scroll ViewDidScroll
delegate方法获取偏移量,然后在同一方法中调用scroll viewB上的
setContentOffset
,传递从委托获得的值


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

方便地说,UITableView是UIScrollView的一个子类。存在一个UIScrollViewDelegate,它具有以下方法:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
如果实现该方法,则可以获得
scrollView
参数的
contentOffset
属性。那么,你应该使用

- (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,但没有特别的理由这样做。

此外,用户滚动的tableview不应发送到scrollViewDidScroll中的setContentOffset:message,因为它会让应用进入无休止的循环。因此,应实施其他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_uu是swift scroll中UIScrollView类型的ivar,对称地滚动两个UITableView:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if tb_time1 == scrollView {
        tb_time2.contentOffset = tb_time1.contentOffset
    }else if tb_time2 == scrollView {
        tb_time1.contentOffset = tb_time2.contentOffset
    }
}

UITableView是UIScrollView的一个子类。Swift解决方案:

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

我想说,从语义上讲,转换为UITableView更好,而且有利于可读性。不过,在这种情况下,从编程的角度来说,这并不重要耶,工作得很好:)谢谢!我会投赞成票,但我写这篇文章时没有15个代表点!我不保证将来的iOS版本会破坏它,但我不明白为什么会这样。不知道你是否可以在这里帮助我。我在tableview中有一个collectionview,希望同步滚动。我该怎么做?我是否必须以某种方式将TableView委托发送到CollectionView单元格,以便它们都依赖于相同的
scrollViewDidScroll(\uScrollView:UIScrollView)