iOS:如何同步两个UIScrollview

我有两个水平的UIScrollview 。 我想在用户拖动手指时同步滚动。 这是我的代码:

 self.topScrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; self.topScrollView.delegate = self; self.topScrollView.bounces = YES; self.bottomScrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; self.bottomScrollView.delegate = self; self.bottomScrollView.bounces = YES; ... - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { if (scrollView == self.topScrollView) { self.bottomScrollView.delegate = nil; } else { self.topScrollView.delegate = nil; } ... } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { ... self.topScrollView.delegate = self; self.bottomScrollView.delegate = self; } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { ... self.topScrollView.delegate = self; self.bottomScrollView.delegate = self; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // Sync the two scroll views if (scrollView == self.topScrollView) { [self.bottomScrollView setContentOffset:scrollView.contentOffset animated:NO]; } else { [self.topScrollView setContentOffset:scrollView.contentOffset animated:NO]; } ... } 

两个滚动视图同步滚动,但问题是所有的弹跳和减速都没有了。 整个滚动运动变得非常僵硬。 如果我删除所有的同步代码,那么每个滚动视图单独工作。 那么,问题是什么? 或者UIScrollView不能同步?

您可以使用topScrollView.panGestureRecognizerbottomScrollView.panGestureRecognizer来获取两个手势识别器,并将它们添加到包含两个滚动视图的公共超级视图中。 在这个超级观点上的手势会被两个孩子所认可。

您很可能也需要成为这两个识别器的代表,并让他们被同时识别:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } 

我根据jszumski的回答制定了解决scheme。 但是,我的情况是两个垂直的UIScrollView并排(scrollViewLeft和scrollViewRight)。 它应该工作水平的UIScrollViews没有太多的修改。

首先,创build一个自定义的UIScrollView。

 //.h file @interface CSScrollView : UIScrollView @end //.m file @implementation CSScrollView -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES; } @end 

其次,在你的主视图中,

 - (void)viewDidLoad { [super viewDidLoad]; [self.view addGestureRecognizer:self.scrollViewLeft.panGestureRecognizer]; [self.view addGestureRecognizer:self.scrollViewRight.panGestureRecognizer]; } 

这就是我需要设置两个同步滚动视图的一切。 真正的效果比在scrollview的scrollViewDidScroll中发送/订阅通知的常规方式好得多,并同步contentOffset。