我有两个嵌套的UIScrollViews:父级仅限于水平分页,而子级仅限于垂直滚动。内容是一个可以自由拖动的大视图,但是可以捕捉到三个水平部分中的一个。嵌套滚动视图的默认行为是仅允许一次向一个方向滚动,但我希望允许同时在两个方向上拖动以保持操纵单个大视图的感觉。
我目前的解决方案包括隔离垂直滚动视图的手势并将其委托设置为我的视图控制器:
for (UIGestureRecognizer *gesture in scrollView.gestureRecognizers)
if ([gesture isKindOfClass:[UIPanGestureRecognizer class]])
gesture.delegate = self;
然后,我实现了委托方法,允许分页视图的手势同时识别滚动视图的平移手势:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if (gestureRecognizer.view == scrollView && otherGestureRecognizer.view == pageView)
return YES; // allow simultaneous scrolling of pageView and scrollView
return NO;
}
这个解决方案大部分都有效,但是当我拖动视图时偶尔会出现故障,特别是当我用鼠标快速移动它或者将它拖过视图边界时。具体来说,其中一个滚动视图将暂时跳回到它开始的位置,好像该手势已被取消,但如果我继续滚动它会跳回来。
我想知道的是,如果有一种更简单或更可靠的方法来实现这样的滚动,我忽略了这一点,或者我是否可以采取任何措施来消除这种毛刺行为。
答案 0 :(得分:3)
当视图被拖出内容区域,释放,然后在滚动视图反弹之前再次点击/拖动时,会发生毛刺行为。例如,当视图由几个小的滑动滚动时,可能会发生这种情况。其中一个滚动视图会混淆并尝试减速(弹跳)同时被拖动,导致它在原点和拖动位置之间来回抖动。
我能够通过反转滚动视图的嵌套(垂直滚动视图内的分页视图)并将委托添加到分页视图的UIPanGestureRecognizer而不是滚动视图的手势来解决这个问题。现在它自然滚动,好像它是单个滚动视图,同时仍然只符合水平方向的分页。我认为滚动视图不会像这样被同时滚动,因此我不确定原始的错误行为是否是错误的结果,或者只是意外做某事的后果。
答案 1 :(得分:2)
一直在努力解决这个问题,并使用'NSInvalidArgumentException'撞墙,原因是:'UIScrollView的内置平移手势识别器必须将其滚动视图作为其委托。正如上文Rythmic Fistman所指出的那样。
找到解决方法...首先将内部UIScrollView子类化并将其作为
然后你要做的就是:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
似乎工作正常。