转发到UIScrollView

Ort*_*ntz 11 iphone cocoa-touch uiscrollview uigesturerecognizer ios

我有两个视图控制器.视图控制器A具有UIScrollView并呈现视图控制器B.该演示是交互式的并由控制器控制scrollView.contentOffset.

我想整合一个交互式消除过渡:当平移时,ViewController B应该以交互方式被解雇.交互式dismiss转换还应控制ViewController的scrollView.

我的第一次尝试是使用a UIPanGestureRecognizerscrollView.contentOffset根据平移距离进行设置.这是有效的,但是当平移手势结束时,必须将scrollView偏移设置为最终位置的动画.使用-[UIScrollView setContentOffset:animated:不是一个好的解决方案,因为它使用线性动画,不考虑当前的平移速度并且不会很好地减速.

所以我认为应该可以将我的平移手势识别器中的触摸事件提供到滚动视图中.这应该给我们所有漂亮的滚动视图动画行为.

我尝试覆盖-touchesBegan/Moved/Ended/Cancelled withEvent:我的UIPanGestureRecognizer子类中的方法,如下所示:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [scrollView touchesBegan:touches withEvent:event];
    [scrollView.panGestureRecognizer touchesBegan:touches withEvent:event];

    [super touchesBegan:touches withEvent:event];
}
Run Code Online (Sandbox Code Playgroud)

但显然有些东西阻止滚动视图进入tracking模式.(确实如此,dragging = YES但这就是它.)我验证了scrollView是userInteractionEnabled,而不是隐藏并添加到视图层次结构中.

那么我怎样才能将我的触摸事件转发给UIScrollView

Ort*_*ntz 13

在阅读了描述事件流程的有趣答案UIScrollView,我得出的结论是,尝试从手势识别器"远程控制"滚动视图可能很难实现,因为触摸在被路由到视图和手势识别器时会发生变化.由于UITouch不符合NSCopying我们也无法克隆触摸事件,以便稍后在未修改状态下发送它们.

虽然没有真正解决我要求的问题,但我找到了解决方法来完成我需要的工作.我刚刚添加了一个滚动视图来查看控制器B并将其与VC A的滚动视图同步(在垂直滚动时添加到视图层次结构中):

// delegate of VC B's scrollView
- (void)scrollViewDidScroll:(UIScrollView*)scrollView
    scrollViewA.contentOffset = scrollView.contentOffset;
}
Run Code Online (Sandbox Code Playgroud)

感谢Friedrich Markgraf 提出这个想法.