iOS:如何同步两个UIScrollview

iOS:如何同步两个UIScrollview,ios,objective-c,uiscrollview,uipangesturerecognizer,Ios,Objective C,Uiscrollview,Uipangesturerecognizer,我有两个水平UIScrollviews。我想在用户拖动手指时同步它们的滚动。这是我的密码: self.topScrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; self.topScrollView.delegate = self; self.topScrollView.bounces = YES; self.bottomScrollView = [[UIScrollView alloc] initWithFrame:CGR

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

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.PangestureRecognitizer
bottomScrollView.PangestureRecognitizer
来获取两个手势识别器,并将它们添加到包含两个滚动视图的公共superview中。然后,两个孩子都能识别这个超级视图上的平移手势

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

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

我根据朱姆斯基的回答得出了解决方案。但是,我的情况是两个垂直的UIScrollView并排(scrollViewLeft和scrollViewRight)。它应该适用于水平UIScrollView,无需太多修改

首先,创建自定义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的常规方式要好得多

@jszumski用Swift回答

  • 创建UIScrollView的自定义子类
  • 符合
    UIgestureRecognitor
    delegate
  • 覆盖
    gestureRecognitizer(u:shouldRecognitizeSimultaneously with:)
    gestureRecognitizerDelegate
    方法
  • public func gestureRecognizer(\uGestureRecognizer:UIGestureRecognizer,应与其他gestureRecognizer:UIGestureRecognizer同时识别)->Bool{
    返回真值
    }
    
  • 两个集合视图需要具有相同的superview。将两个手势识别器添加到superview
  • yourSuperview.AddgestureRecognitor(scrollView1.PangestureRecognitor)
    yourSuperview.AddGestureRecognitor(滚动视图1)
    

    希望这有帮助

    我尝试将我的控制器添加为委托,但分配失败,出现以下异常:“'UIScrollView的内置平移手势识别器必须将其滚动视图作为其委托”我想我总是可以将滚动视图子类化并重写该方法。酷,我认为这应该行得通。嗯,如果其中一个滚动视图的内容大小是动态的呢?