我有两个视图控制器.视图控制器A具有UIScrollView并显示视图控制器B.演示文稿是交互式的,由scrollView.contentOffset控制.
我想集成一个互动的解雇过渡:当平移时,ViewController B应该被交互地解雇.交互式关闭转换也应该控制ViewController A的scrollView.
我第一次尝试使用UIPanGestureRecognizer并根据平移距离设置scrollView.contentOffset.但是,当平移手势结束时,scrollView偏移必须动画到结束位置.使用 – [UIScrollView setContentOffset:animated:不是一个很好的解决方案,因为它使用线性动画,不考虑当前的平移速度,并不能很好地减速.
所以我认为应该可以将触摸事件从我的平移手势识别器提供到滚动视图.这应该给我们所有的漂亮的滚动视图动画行为.
我尝试覆盖我的UIPanGestureRecognizer子类中的-touchesBegan / Moved / Ended / Cancelled withEvent:方法,如下所示:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [scrollView touchesBegan:touches withEvent:event]; [scrollView.panGestureRecognizer touchesBegan:touches withEvent:event]; [super touchesBegan:touches withEvent:event]; }
但显然,阻止滚动视图进入跟踪模式. (它去拖动= YES,但这是关于它.)我验证了scrollView是userInteractionEnabled,不被隐藏并添加到视图层次结构.
那么如何将我的触摸事件转发到UIScrollView?
解决方法
在阅读了描述UIScrollView的事件流程的
interesting answer之后,我得出的结论是,尝试从手势识别器“遥控”滚动视图可能非常难以实现,因为触摸在被路由到视图和手势识别器时被突变.由于UITouch不符合NSCopying,我们也不能克隆触摸事件,以便稍后在未修改的状态下发送它们.
虽然没有真正解决我问的问题,但我发现了一个解决办法来完成我所需要的.我刚刚添加了一个滚动视图来查看控制器B,并与VC A的滚动视图(垂直滚动时添加到视图层次结构中)进行同步:
// delegate of VC B's scrollView - (void)scrollViewDidScroll:(UIScrollView*)scrollView scrollViewA.contentOffset = scrollView.contentOffset; }
感谢Friedrich Markgraf谁came up with the idea.