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回答
UIgestureRecognitor
delegategestureRecognitizer(u:shouldRecognitizeSimultaneously with:)
gestureRecognitizerDelegate
方法public func gestureRecognizer(\uGestureRecognizer:UIGestureRecognizer,应与其他gestureRecognizer:UIGestureRecognizer同时识别)->Bool{
返回真值
}
yourSuperview.AddgestureRecognitor(scrollView1.PangestureRecognitor)
yourSuperview.AddGestureRecognitor(滚动视图1)
希望这有帮助 我尝试将我的控制器添加为委托,但分配失败,出现以下异常:“'UIScrollView的内置平移手势识别器必须将其滚动视图作为其委托”我想我总是可以将滚动视图子类化并重写该方法。酷,我认为这应该行得通。嗯,如果其中一个滚动视图的内容大小是动态的呢?